求 SN = 2 + 22 + 222 + 2222 + ... + 2...2(n个2)的程序

张开发
2026/4/21 11:29:07 15 分钟阅读

分享文章

求 SN = 2 + 22 + 222 + 2222 + ... + 2...2(n个2)的程序
C语言求 SN 2 22 222 2222 … 2…2n个2的程序一、基础方法逐项累加1. 非函数方式#includestdio.hintmain(){intn,i,j;longlongsum0,term0;printf(请输入n的值: );scanf(%d,n);for(i1;in;i){term0;for(j1;ji;j){termterm*102;}sumterm;}printf(SN %lld\n,sum);return0;}2. 函数方式#includestdio.hlonglongcalculateSN(intn){longlongsum0,term0;inti,j;for(inti1;in;i){term0;for(intj1;ji;j){termterm*102;}sumterm;}returnsum;}intmain(){intn;printf(请输入n的值: );scanf(%d,n);printf(SN %lld\n,calculateSN(n));return0;}二、优化方法递推公式1. 非函数方式#includestdio.hintmain(){intn,i;longlongsum0,term0;printf(请输入n的值: );scanf(%d,n);for(i1;in;i){termterm*102;sumterm;}printf(SN %lld\n,sum);return0;}2. 函数方式#includestdio.hlonglongcalculateSN(intn){longlongsum0,term0;for(inti1;in;i){termterm*102;sumterm;}returnsum;}intmain(){intn;printf(请输入n的值: );scanf(%d,n);printf(SN %lld\n,calculateSN(n));return0;}三、递归方法1. 递归求和#includestdio.hlonglonggetTerm(intn){if(n1)return2;returngetTerm(n-1)*102;}longlongcalculateSN(intn){if(n1)return2;returncalculateSN(n-1)getTerm(n);}intmain(){intn;printf(请输入n的值: );scanf(%d,n);printf(SN %lld\n,calculateSN(n));return0;}2. 递归优化版#includestdio.hvoidcalculateSN(intn,longlong*sum,longlong*term){if(n0)return;*term*term*102;*sum*term;calculateSN(n-1,sum,term);}intmain(){intn;longlongsum0,term0;printf(请输入n的值: );scanf(%d,n);calculateSN(n,sum,term);printf(SN %lld\n,sum);return0;}四、数学公式方法1. 等比数列公式#includestdio.h#includemath.hlonglongcalculateSN(intn){inti;// SN 2/9 * (10^n - 1) 20/9 * (10^(n-1) - 1) ... 2n/9 * (10 - 1)// 简化后SN 2/81 * (10^(n1) - 9n - 10)longlongpower1;for(i0;in1;i){power*10;}return(2*(power-9*n-10))/81;}intmain(){intn;printf(请输入n的值: );scanf(%d,n);printf(SN %lld\n,calculateSN(n));return0;}2. 递推公式优化#includestdio.hlonglongcalculateSN(intn){inti;longlongsum0,term0;for(i1;in;i){termterm*102;sumterm;}returnsum;}intmain(){intn,i;printf(请输入n的值: );scanf(%d,n);printf(各项为: );longlongterm0;for(i1;in;i){termterm*102;printf(%lld ,term);}printf(\n);printf(SN %lld\n,calculateSN(n));return0;}五、不同实现风格1. 数组存储方式#includestdio.hintmain(){intn,i;longlongterms[100],sum0;printf(请输入n的值: );scanf(%d,n);terms[0]2;sumterms[0];for(i1;in;i){terms[i]terms[i-1]*102;sumterms[i];}printf(各项为: );for(i0;in;i){printf(%lld ,terms[i]);}printf(\n);printf(SN %lld\n,sum);return0;}2. 指针方式#includestdio.hvoidcalculateSN(intn,longlong*sum){inti;longlongterm0;for(i1;in;i){termterm*102;*sumterm;}}intmain(){intn;longlongsum0;printf(请输入n的值: );scanf(%d,n);calculateSN(n,sum);printf(SN %lld\n,sum);return0;}3. 宏定义方式#includestdio.h#defineCALCULATE_SN(n)({\inti;longlongsum0,term0;\for(i1;i(n);i){\ termterm*102;\ sumterm;\}\ sum;\})intmain(){intn;printf(请输入n的值: );scanf(%d,n);printf(SN %lld\n,CALCULATE_SN(n));return0;}六、完整测试程序多种算法对比#includestdio.h// 方法1双重循环longlongmethod1(intn){longlongsum0,term0;inti,j;for(i1;in;i){term0;for(j1;ji;j){termterm*102;}sumterm;}returnsum;}// 方法2递推公式longlongmethod2(intn){longlongsum0,term0;inti;for(i1;in;i){termterm*102;sumterm;}returnsum;}// 方法3递归longlongmethod3(intn){if(n0)return0;longlongterm0;inti;for(i1;in;i){termterm*102;}returntermmethod3(n-1);}intmain(){intn,i;printf(请输入n的值: );scanf(%d,n);printf(\n 不同算法结果 \n);printf(双重循环: SN %lld\n,method1(n));printf(递推公式: SN %lld\n,method2(n));printf(递归方法: SN %lld\n,method3(n));// 显示各项printf(\n各项为: );longlongterm0;for(i1;in;i){termterm*102;printf(%lld ,term);}printf(\n);return0;}输入输出示例输入请输入n的值: 3输出SN 246解释SN 2 22 222 246输入请输入n的值: 5输出SN 24690解释SN 2 22 222 2222 22222 24690算法复杂度对比算法时间复杂度空间复杂度特点双重循环O(n²)O(1)简单直观递推公式O(n)O(1)高效实用递归方法O(n²)O(n)递归栈数学公式O(1)O(1)理论最优推荐使用递推公式方法是最推荐的实现方式时间复杂度O(n)空间复杂度O(1)代码简洁易于理解性能优秀

更多文章