***我才是真正的签到题***(c++大数)

mac2024-11-29  25

我才是真的签到题 原题链接https://nuoyanli.com/contest/25/problem/C 首先规律较为简单 PS 1 2 3 4 5 6 1 3 4 7 11 18 第一个数加第二个数等于第三个数

c_str():指向某个地址

大数 主函数设置一个字符串s装数 将规律全部计算出来 给没有规律的1和2赋值1,3; 利用add将第一个数和第二个数的和赋予第三个数 每次输入n用**c_str()**输出对应的值

int main() { string s[100005]; s[1]='1'; s[2]='3'; int i,n; for(i=3;i<=260;i++)//最大值为250; { s[i]=add(s[i-1],s[i-2]); } while(~scanf("%d",&n)) { printf("%s\n",s[n].c_str());//输出对应n; } return 0; }

add 利用字符串反向相加计算出相加后的值 c++中可以使用‘1’+a的形式直接将1加到字符串a的前面 string:定义一个字符串

string add(string aa,string bb) { string aaa=aa; string bbb=bb; if(aa.length()<bb.length())//判断两个字符串的长度选取长的; { aaa=bb; bbb=aa; } long long q,w,qq,ww; q=aaa.size();//读取位数 w=bbb.size(); qq=q-1; for(ww=w-1;ww>=0;qq--,ww--)//倒着将两个字符串一个一个相加; { aaa[qq]+=bbb[ww]-'0'; } for(qq=q-1;qq>=1;qq--) { if(aaa[qq]>'9')//对于每一位如果大于9; { aaa[qq]-=10;//取个位 aaa[qq-1]++;//前一位加1; } } if(aaa[0]>'9')//最后一位如果进位就补上第一位的1 { aaa[0]-=10; aaa='1'+aaa; } return aaa; }

总代码

#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; string add(string aa,string bb) { string aaa=aa; string bbb=bb; if(aa.length()<bb.length()) { aaa=bb; bbb=aa; } long long q,w,qq,ww; q=aaa.size(); w=bbb.size(); qq=q-1; for(ww=w-1;ww>=0;qq--,ww--) { aaa[qq]+=bbb[ww]-'0'; } for(qq=q-1;qq>=1;qq--) { if(aaa[qq]>'9') { aaa[qq]-=10; aaa[qq-1]++; } } if(aaa[0]>'9') { aaa[0]-=10; aaa='1'+aaa; } return aaa; } int main() { string s[100005]; s[1]='1'; s[2]='3'; int i,n; for(i=3;i<=260;i++) { s[i]=add(s[i-1],s[i-2]); } while(~scanf("%d",&n)) { printf("%s\n",s[n].c_str()); } return 0; }
最新回复(0)