//浙大2010:题目1015:还是A+B //读入两个小于10000的正整数A和B,计算A+B。 //需要注意的是:如果A和B的末尾K(不超过8)位数字相同,请直接输出-1。 #include <fstream> #include <iostream> using namespace std; int main() { int i, j, k, m, n; int a, b; int D[9]={0,10,100,1000,10000,100000,1000000,10000000,100000000}; ifstream cin("ZJU_1015.txt");// while( cin >> a >> b >> k && a+b ){ if(a%D[k]==b%D[k]) cout << "-1\n"; else cout << a+b << endl; } system("pause"); return 0; }
九度OJ给这道题标记了5星的最高难度 你信么?如果数学有自信 可以直接把前26个素数写出来 如果想求稳或偷懒 可以写个小程序先输出这些素数 才copy到定义的数组处
然后按位处理大数加法即可 区别是以往是以10进位 现在是以odd[i]进位
//浙大2010:题目1016:火星A+B //读入两个不超过25位的火星正整数A和B,计算A+B //在火星上,整数不是单一进制的,第n位的进制就是第n个素数 //相邻位用","隔开 #include <fstream> #include <memory.h> #include <algorithm> #include <string> #include <iostream> using namespace std; int odd[]={2,3,5,7,11,13,17,19,23,29,31,37, 41,43,47,53,59,61,67,71,73,79,83,89,97,101}; int a[26], b[26],c[26]; int convertToNum( string s ){ int len = s.length(); int result = s[0]-48; for( int i=1; i<len; i++ ) result = result*10 + s[i] - 48; //cout << "result=" << result << endl;// return result; } void getNum( string s, int Bit, int d[] ){ //这里不能用a[]做形参因a已是全局变量 int i, j, k; string t; if( Bit==0 ){ d[0] = s[0] - 48; return; } while( Bit!=-1 ){ i=s.find(","); //cout << s << " " << i << endl;// d[Bit--] = convertToNum( s.substr(0,i) ); s = s.substr(i+1,s.length()-i); } } int main() { int i, j, k, m, n; string A, B; int alen, blen, Abit, Bbit, maxbit; ifstream cin("ZJU_1016.txt");// while( cin >> A >> B && (A!="0"||B!="0") ){ Abit = Bbit = 0; alen = A.length(); blen = B.length(); for( i=0; i<alen; i++ ) if( A[i]==',' ) Abit++; for( i=0; i<blen; i++ ) if( B[i]==',' ) Bbit++; maxbit = max(Abit,Bbit); ////calc odd //int count =0; //for( i=2; count<=25; i++ ){ // bool pass=1; // for( j=2; j<=i>>1; j++ ) // if( i%j==0 ) { pass=0; break; } // if(pass) { cout << i << ","; count++; } //} cout << endl; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); getNum( A, Abit, a ); getNum( B, Bbit, b ); //cout << "A= "; //for( i=maxbit; i>=0; i-- ) // cout << a[i] << " "; //cout << endl; //cout << "B= "; //for( i=maxbit; i>=0; i-- ) // cout << b[i] << " "; //cout << endl; c[0] = 0; maxbit++; for( i=0; i<=maxbit; i++ ){ a[i] = a[i]+b[i]+c[i]; c[i+1] = a[i]/odd[i]; //c[]=进位 a[i] %= odd[i]; } bool flag = 0; for( i=maxbit; i>0; i-- ){ if( flag==0 ) if( a[i] ) flag = 1; if( flag ) cout << a[i] << ","; } cout << a[0] << endl; //cout << endl;// } system("pause");// return 0; }
//浙大2010:题目1018:统计同成绩学生人数 //读入N名学生的成绩,将获得某一给定分数的学生人数输出。 //input: //第1行:N //第2行:N名学生的成绩,相邻两数字用一个空格间隔。 //第3行:给定分数 //当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。 #include <fstream> #include <memory.h> #include <iostream> using namespace std; int main() { int i, j, k, m, n; int a[101]; ifstream cin("ZJU_1018.txt");// while( cin >> n && n ){ memset(a,0,sizeof(a)); for( i=0; i<n; i++ ){ cin >> k; a[k]++; } cin >> j; cout << a[j] << endl; } system("pause"); return 0; }
先用getline把改行字符串喂给字符串变量line 再用istringstream s(line)把line喂给字符串变量s 此时s就具备了输出数据的功能 可供cin获取内容 C的写法还更简洁些 用sscanf直接读char数组即可 然后优先处理乘除 并用两个栈分别保存操作数和操作符 最后for循环处理加减
//浙大2010:题目1019:简单计算器 //读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 //样例输入: // 1 + 2 // 4 + 2 * 5 - 7 / 11 // 0 //样例输出: // 3.00 // 13.36 #include <fstream> #include <memory.h> #include <string> #include <iostream> #include <sstream> using namespace std; int main() { int i, j, k, m, n; string s, t, line; double num[200], temp; char op[200]; int opi, numi; //i=index ifstream cin("ZJU_1019.txt");// cout.precision(2);cout.setf(ios::fixed); while( getline(cin,line) && line!="0" ){ istringstream s(line); opi = numi = 0; s >> num[numi]; while( s >> op[opi] >> temp ){ if( op[opi]=='*' ) num[numi]*=temp; else if( op[opi]=='/' ) num[numi]/=temp; else { opi++; num[++numi]=temp; } } //for( i=0; i<opi; i++ ) // cout << op[i]; //cout << endl; //for( i=0; i<numi; i++ ) // cout << num[i] << " "; //cout << endl; for( i=0,j=0; i<opi; i++ ){ if( op[i]=='+' ) num[0]+=num[++j]; else num[0]-=num[++j]; } cout << num[0] << endl; } system("pause"); return 0; }