这个c语言编程题如何求解?

编写函数,int suml(int n),该函数的功能为计算1+2+3+.…+n。再编写函数int sum2(intn),该函数的功能为计算1+(1+2)+(1+2+3)+…+(1+2+3+.…+n)。Sum2函数在编写过程中调用sum1函数计算每个括号的值,主函数调用sum2,输出该数列的和。

第1个回答  2022-05-25
如果非要用两个函数,则:
sum1函数可以用等差数列求和公式降低时间复杂度
时间复杂度O(n)

其实sum2本身就有求和公式:
1+(1+2)+...+(1+2+...+n)=n(n+1)(n+2)÷6
时间复杂度O(1)
详见代码
#include<bits/stdc++.h>
#include<chrono>
#define int unsigned long long
using namespace std;
using namespace chrono;
int n;
//法1(O(n^2))
int sum11(int k){
int s=0;
for(int i=1;i<=k;i++) s+=i;
return s;
}
int sum12(int n){
int s2=0;
for(int i=1;i<=n;i++) s2+=sum11(i);
return s2;
}
//法2(O(n))
int sum21(int k){
return (1+k)*k/2;
}
int sum22(int n){
int s2=0;
for(int i=1;i<=n;i++) s2+=sum21(i);
return s2;
}
//法3
int sum32(int n){
return n*(n+1)*(n+2)/6;
}
signed main(){
cin>>n;
auto start1=system_clock::now();
cout<<"法1:"<<sum12(n);
auto end1=system_clock::now();
auto duration1=duration_cast<microseconds>(end1-start1);
cout<<" 用时"<<double(duration1.count())*microseconds::period::num/microseconds::period::den<<"秒"<<endl;
auto start2=system_clock::now();
cout<<"法2:"<<sum22(n);
auto end2=system_clock::now();
auto duration2=duration_cast<microseconds>(end2-start2);
cout<<" 用时"<<double(duration2.count())*microseconds::period::num/microseconds::period::den<<"秒"<<endl;
auto start3=system_clock::now();
cout<<"法3:"<<sum32(n);
auto end3=system_clock::now();
auto duration3=duration_cast<microseconds>(end3-start3);
cout<<" 用时"<<double(duration3.count())*microseconds::period::num/microseconds::period::den<<"秒"<<endl;
return 0;
}
运行结果:
80000
法1:85336533360000 用时6.85699秒
法2:85336533360000 用时0秒
法3:85336533360000 用时0秒
------
望您采纳,谢谢本回答被提问者采纳
第2个回答  2022-06-29
求解C语言编程题。。。 #include int main(){float score = 0;if(scanf( %f , &score) != 1){puts( error );return -1;}if(score > 100 || score < 0){puts( score error );return -1;}switch(score/10) //两个整数运算结果一定是个整数{case 10:case 9:puts( A );break; //break:当前是用于跳出switch语句case 8:puts( B );break;case 7:puts( C );break;case 6:puts( D );break;default:puts( E );}

return 0;}
第3个回答  2022-06-29
求解C语言编程题。。。 #include int main(){float score = 0;if(scanf( %f , &score) != 1){puts( error );return -1;}if(score > 100 || score < 0){puts( score error );return -1;}switch(score/10) //两个整数运算结果一定是个整数{case 10:case 9:puts( A );break; //break:当前是用于跳出switch语句case 8:puts( B );break;case 7:puts( C );break;case 6:puts( D );break;default:puts( E );}

return 0;}
第4个回答  2022-06-29
求解C语言编程题。。。 #include int main(){float score = 0;if(scanf( %f , &score) != 1){puts( error );return -1;}if(score > 100 || score < 0){puts( score error );return -1;}switch(score/10) //两个整数运算结果一定是个整数{case 10:case 9:puts( A );break; //break:当前是用于跳出switch语句case 8:puts( B );break;case 7:puts( C );break;case 6:puts( D );break;default:puts( E );}

return 0;}
第5个回答  2022-06-28
求解C语言编程题。。。 #include int main(){float score = 0;if(scanf( %f , &score) != 1){puts( error );return -1;}if(score > 100 || score < 0){puts( score error );return -1;}switch(score/10) //两个整数运算结果一定是个整数{case 10:case 9:puts( A );break; //break:当前是用于跳出switch语句case 8:puts( B );break;case 7:puts( C );break;case 6:puts( D );break;default:puts( E );}

return 0;}
相似回答