浙江大学の2006年の再試験の上で機械の問題の解題の報告


九度OJテーマ1015:やはりA+B
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1111解決:701
タイトルの説明:
10000未満の2つの正の整数AとBを読み込み、A+Bを計算します.なお、AとBの末尾K(8を超えない)ビット数が同じ場合は、-1を直接出力してください.
入力:
試験入力にはいくつかの試験例が含まれており、各試験例は1行を占め、フォーマットは「A B K」であり、隣接する2つの数字にはスペース間隔がある.AとBが同時に0の場合、入力が終了し、対応する結果は出力されません.
出力:
各試験例に対して1行、すなわちA+Bの値または-1を出力する.
サンプル入力:
    1 2 1
    11 21 1
    108 8 2
    36 64 3
    0 0 1
サンプル出力:
    3
    -1
    -1
    100
// 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
"; else cout << a+b << endl; } system("pause"); return 0; }

九度OJテーマ1016:火星A+B
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1259解決:356
タイトルの説明:
25ビットを超えない2つの火星の正の整数AとBを読み込み、A+Bを計算します.火星では整数は単一進数ではなく、n位の進数はn番目の素数であることに注意しなければならない.例えば、地球上の10進数2は、火星では「1,0」と表記されています.火星の桁数は2進数だからです.地球上の10進数38は、火星では「1,1,1,0」と表記されています.火星の桁数は2進数、10桁は3進数、百桁は5進数、千桁は7進数だからです.
入力:
テスト入力にはいくつかのテスト例が含まれており、各テスト例は1行を占め、2つの火星の正の整数AとBを含み、火星の整数の隣接する2桁はカンマで区切られ、AとBの間にスペース間隔がある.AまたはBが0の場合、入力が終了し、対応する結果は出力されません.
出力:
試験例毎に1行、すなわち火星表現法のA+Bの値を出力する.
サンプル入力:
    1,0 2,1
    4,2,0 1,2,0
    1 10,6,4,2,1
    0 0
サンプル出力:
    1,0,1
    1,1,1,0
    1,0,0,0,0,0
9度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;
}

九度OJテーマ1017:やはりスムーズな工事
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:898解決:466
タイトルの説明:
ある省は田舎の交通状況を調査し、得られた統計表には任意の2つの村間の距離がリストされている.省政府の「円滑な工事」の目標は、全省のどの2つの村の間でも道路交通を実現できるようにすることである(しかし、直接的な道路がつながっているとは限らず、間接的に道路を通過すればよい)、敷設された道路の総長さを最小限に抑えることを要求している.最小の道路の全長を計算してください.
入力:
テスト入力には、いくつかのテスト例が含まれます.各試験例の1行目は、村の数N(<100)を与える.その後のN(N−1)/2行は村間の距離に対応し,各行には2つの村の番号とこの2つの村間の距離のペアの正の整数を与えた.簡単にするために、村は1からN番までです.
Nが0の場合、入力は終了し、この例は処理されない.
出力:
各試験例について、1行に最小の道路総長を出力する.
サンプル入力:
    3
    1 2 1
    1 3 2
    2 3 4
    4
    1 2 1
    1 3 4
    1 4 1
    2 3 3
    2 4 2
    3 4 5
    0
サンプル出力:
    3
    5
しばらく滞在する
九度OJテーマ1018:同成績の学生数を統計する
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1409解決:800
タイトルの説明:
N名の生徒の成績を読み込むと,ある所定の点数を獲得した生徒数が出力される.
入力:
テスト入力にはいくつかのテスト例が含まれており、各テスト例のフォーマットは
1行目:N
2行目:N人の学生の成績で、隣接する2つの数字は1つのスペースで隔てられています.
3行目:指定されたスコア
N=0と読むと入力が終了します.ここで、Nは1000を超えず、成績点数は0から100の間の整数である.
出力:
各試験例について、所定の点数の学生数出力が得られる.
サンプル入力:
    3
    80 60 90
    60
    2
    85 66
    0
    5
    60 75 90 55 75
    75
    0
サンプル出力:
    1
    0
    2
// 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;
}

九度OJテーマ1019:簡単計算機
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1476解決:500
タイトルの説明:
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
入力:
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
出力:
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
サンプル入力:
    1 + 2
    4 + 2 * 5 - 7/11
    0
サンプル出力:
    3.00
    13.36
まずgetlineで改行文字列を文字列変数lineに与え、istringstream s(line)で文字列変数sにlineを与えると、cinがコンテンツCを取得するための出力データの機能が備えられ、sscanfでchar配列を直接読めばよいので、乗除を優先して2つのスタックでオペランドとオペレータをそれぞれ保存し、最後に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;
}