解题思路:
如果按照问题中给出的解题思路进行解题,个人水平有限,只能写出满足一半例程的程序,另外的一半例程可能是由于数据太大了,使用stoi()函数与stringstream均无法正确地将字符串转换到整数类型,也就无法接下来的取余操作,所以就根据题解区的提示,采用大数取余的方式来解决问题。
大数取余核心代码:
//大叔取余!!---直接求得最后的结果
int len = strlen(a);
long long result = 0;
for(int i=0;i<len;++i){
result = (result*10 + (int)(a[i]-'0'))%xx;
//cout<<"第"<<i<<"次:"<<result<<endl;
}
注意事项:
大数取余的核心就是边读取字符串边处理,这样以至于数据不太太大,等到整个字符串数据处理完时,就得到了最后的结果
参考代码:
按照问题提示的解题代码(只能通过一半的测试案例)
//不能全对版本 整数取余 #include <bits/stdc++.h> #include <iostream> #include <cstring> using namespace std; char a[10001]; int main() { //while(cin.getline(a,10001) != NULL) while(gets(a) != NULL) { if(a[0] == '0') { break; } //开始处理 long long int ss = 0; //将每一位转化为数字 int len = strlen(a); // stringstream sss; // sss<<a; // sss>>ss; // cout<<ss<<endl; for(int i=0;i<=len-2;++i) //去除最后一位 { ss = ss*10 + (int)(a[i]-'0'); //cout<<"ss: "<<ss<<endl; } //对ss进行操作 ss -= (a[len-1]-'0')*5; //cout<<ss<<endl; //ss=1717171717171717171717171717171717171717171717171718; while(ss %= 17) { } if(ss != 0) { cout<<"0"<<endl; break; } if(ss == 0) { cout<<"1"<<endl; } } return 0; }
按照大数取余的思路的解题代码:
//整数取余 #include <bits/stdc++.h> using namespace std; const int maxx=120; char a[maxx]; int main(){ int xx=17; while(gets(a) != NULL) { if(a[0] == '0') { break; } //大叔取余!!---直接求得最后的结果 int len = strlen(a); long long result = 0; for(int i=0;i<len;++i){ result = (result*10 + (int)(a[i]-'0'))%xx; //cout<<"第"<<i<<"次:"<<result<<endl; } if(result ==0) { cout<<"1"<<endl; } else if(result != 0) { cout<<"0"<<endl; } } return 0; }
希望大家越变越强!
0.0分
0 人评分
C语言训练-自守数问题 (C语言代码) long long浏览:1066 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:1071 |
永远的丰碑 (C语言代码)浏览:656 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:528 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:869 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:734 |
C语言考试练习题_排列 (C语言代码)浏览:725 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:1006 |
前10名 (C语言代码)浏览:727 |
C语言程序设计教程(第三版)课后习题10.7 (用指针求解)浏览:1475 |