#include <iostream> #include <sstream> #include <list> using namespace std; string showExponentSP(int temp, int item); //用來處理輸入裡面最先出現的項次 string showExponent(int temp, int item); //用來處理剩下的項次 //item 表示"項次" //temp 表示"輸入的值" int main() { string str = ""; list<int> l; int input; int counter = 0; int level = 8; cin>>input; while( cin ) { l.push_back(input); counter++; if(counter == 9) { list<int>::iterator iter = l.begin(); while( iter != l.end() ) { if(str.empty()) { str.append(showExponentSP(*iter,level)); } else { str.append(showExponent(*iter,level)); } ++iter; level--; } cout<<str<<endl; str.clear(); l.clear(); counter = 0; level = 8; } cin>>input; } return 0; } string showExponentSP(int temp, int item) { string s=""; stringstream ss(s); if(item == 0) { ss<<temp; } else if(item == 1) { if (temp == 0) { ss<<""; } else { if(temp == -1) ss<<"-x"; else if(temp == 1) ss<<"x"; else ss<<temp<<"x"; } } else { if (temp == 0) { ss<<""; } else { if(temp == -1) ss<<"-x^"<<item; else if(temp == 1) ss<<"x^"<<item; else ss<<temp<<"x^"<<item; } } return ss.str(); } string showExponent(int temp, int item) { string s=""; stringstream ss(s); if(item>1) { if(temp == -1) ss<<" - "<<"x^"<<item; else if(temp == 1) ss<<" + "<<"x^"<<item; else if(temp<0) ss<<" - "<<(-temp)<<"x^"<<item; else if(temp>0) ss<<" + "<<temp<<"x^"<<item; else ss<<""; } else if(item == 0) { if(temp<0) ss<<" - "<<(-temp); else if(temp>0) ss<<" + "<<temp; else ss<<""; }else { if(temp == -1) ss<<" - "<<"x"; else if(temp == 1) ss<<" + "<<"x"; else if(temp<-1) ss<<" - "<<(-temp)<<"x"; else if(temp>1) ss<<" + "<<temp<<"x"; else ss<<""; } //cout<<item<<" "; return ss.str(); }
Friday, November 19, 2010
ACM-392 Polynomial Showdown with C++
Sunday, November 7, 2010
ACM-382 Perfection with C++
#include <iostream> #include <iomanip> #include <list> using namespace std; int sqrts(int test); void compare(int val, int com); int main() { int input; int result; list<int> l; cin>>input; while(input != 0) { l.push_back(input); cin>>input; } cout<<"PERFECTION OUTPUT"<<endl; list<int>::iterator iter = l.begin(); while( iter != l.end() ) { result = sqrts(*iter); compare(*iter, result); ++iter; } cout<<"END OF OUTPUT"<<endl; return 0; } int sqrts(int test) { int temp = 0; for(int i = 1 ; i < test ; i++) { if(test%i == 0) { temp = temp + i; } } return temp; } void compare(int val, int sum) { if(val > sum) cout<<setw(5)<<val<<" DEFICIENT"<<endl; else if(val == sum) cout<<setw(5)<<val<<" PERFECT"<<endl; else cout<<setw(5)<<val<<" ABUNDANT"<<endl; }
Wednesday, September 29, 2010
找因數 with C++
#include <iostream> #include <sstream> #include "math.h" #include <stack> #include <windows.h> using namespace std; void brute(int test); void sqrts(int test); int main() { int input; cout << "Input a integer" << endl; cin>>input; LARGE_INTEGER m_liPerfFreq={0}; QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart={0}; QueryPerformanceCounter(&m_liPerfStart); brute(input); LARGE_INTEGER liPerfNow={0}; QueryPerformanceCounter(&liPerfNow); long decodeDulation=( ((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000000)/m_liPerfFreq.QuadPart); LARGE_INTEGER m_liPerfFreq2={0}; QueryPerformanceFrequency(&m_liPerfFreq2); LARGE_INTEGER m_liPerfStart2={0}; QueryPerformanceCounter(&m_liPerfStart2); sqrts(input); LARGE_INTEGER liPerfNow2={0}; QueryPerformanceCounter(&liPerfNow2); long decodeDulation2=( ((liPerfNow2.QuadPart - m_liPerfStart2.QuadPart) * 1000000)/m_liPerfFreq2.QuadPart); cout.setf(ios::showpoint, ios::fixed); cout.precision (10); cout<<decodeDulation<<" "<<decodeDulation2<<endl; return 0; } void brute(int test) { string str = ""; stringstream ss(str); for(int i = 1 ; i <= test ; i++) { if(test%i == 0) { ss<<i<<"|"; } } cout<<ss.str()<<endl; } void sqrts(int test) { string str = ""; stringstream ss(str); stack<int> first; int temp; double sq; sq = (int) sqrt(test); for(int i = 1 ; i <= sq ; i++) { if(test%i == 0) { ss<<i<<"|"; if(test/i != i) { first.push(test/i); } } } while(!first.empty()) { temp = first.top(); first.pop(); ss<<temp<<"|"; } cout<<ss.str()<<endl; }
Thursday, July 29, 2010
ACM-488 Triangle Wave with C++
#include <iostream>
using namespace std;
void printres(int a);
int main(int argc, char* argv[])
{
int A[100],F[100];
int group;
int temp;
while(cin>>group)
{
for(int i=0 ; i<group ;i++)
{
cin>>A[i]>>F[i];
}
for(int l=0 ; l<group ;l++)
{
for(int n=0; n<F[l] ;n++)
{
temp = A[l];
printres(temp);
if(n<(F[group-1]-1))
cout<<endl;
}
}
}
return 0;
}
void printres(int a)
{
for(int k=1; k<=a ;k++)
{
for(int j=0; j<k ;j++)
{
cout<<k;
}
cout<<endl;
}
for(int m=1 ; m<a ;m++)
{
for(int j=0; j<(a-m) ;j++)
{
cout<<(a-m);
}
cout<<endl;
}
}
難度僅次於ACM100 的3n+1
本題很適合用來練習迴圈(for while)
但是我都用for
本題最難的地方是..................排版 = =a
我也很偷懶
所以直接宣告A[100] F[100]
超級偷懶的 囧
ACM-530 Binomial Showdown with C++
/********************************/ /* This program is used to */ /* calculate C(N,R) */ /* */ /* */ /* First input is N ,and second */ /* one is R */ /* Output is the result of */ /* C(N,R) */ /********************************/ #include <iostream> using namespace std; long double calculate(int n , int r); int main(int argc, char* argv[]) { int N,R,temp; long double res; while(cin>>N>>R) { //the situation that stop the program if(N==0 && R==0) { break; } /****************************/ /* check */ /* if N!=R and R > N/2 */ /* then C(N,R) = C(N,N-R) */ /****************************/ if(N != R && R > (N/2)) { temp = N - R; }else { temp = R; } /* start to caiculate C(N,R) */ res = calculate(N ,temp); printf("%0.Lf\n",res); } return 0; } long double calculate( int n , int r) { long double tempres = 1.0; if(n == r) { return 1; } else if(r == 1) { return n; } else if(r ==0) { return 1; } else { for(int i=1 ; i<=r ; i++) { tempres = (tempres * (n-r+i) / i) ; } return tempres; } }
幾乎和369是一樣的題目
除了一部分的條件不同
根本是寫一題賺兩題 = =a
ACM-374 Big Mod with C++
/********************************/
/* This program is used to */
/* calculate */
/* R = B^P mod M */
/********************************/
#include <iostream>
#include <ctype.h>
#include <cstdio>
#include <math.h>
using namespace std;
long long M;
long long ans_power(long long a ,long long b);
int main(int argc, char* argv[])
{
long long B,P;
long long res;
while(cin>>B>>P>>M)
{
if(M == 1)
{
res = 0;
}
else if(B == 0 && P == 0) //0^0 = 1
{
res = 1;
}
else if(B == 0 && P != 0) //0^n = 0
{
res = 0;
}
else if(B != 0 && P == 0) //n^0 = 1
{
res = 1;
}
else
{
res = ans_power(B,P) % M;
}
cout<<res<<endl;
}
return 0;
}
long long ans_power(long long a ,long long b)
{
if (b == 0)
{
return 1;
}
else if ((b % 2) == 1)
{
long long foo = ans_power(a, (b/2));
return ((foo * foo * a) % M);
}
else
{
long long foo = ans_power(a, (b/2));
return ((foo * foo) % M);
}
}
本來用for迴圈做
也是吃了TLE
決定切開來mod這樣比較快
不然本來2的300次方
迴圈跑300次
切開之後變成超省時
ACM-369 Combinations with C++
/********************************/ /* This program is used to */ /* calculate C(N,R) */ /* */ /* */ /* First input is N , */ /* and second is R */ /* Output is the result of */ /* C(N,R) */ /********************************/ #include <iostream> using namespace std; long double calculate(int n , int r); int main(int argc, char* argv[]) { int N,R,temp; long double res; while(cin>>N>>R) { //the situation that stop the program if(N==0 && R==0) { break; } /********************************/ /* check */ /* if N!=R and R > N/2 */ /* then C(N,R) = C(N,N-R) */ /********************************/ if(N != R && R > (N/2)) { temp = N - R; }else { temp = R; } /* start to caiculate C(N,R) */ res = calculate(N ,temp); printf("%d things taken %d at a time is %0.Lf exactly.\n",N,R,res); } return 0; } long double calculate( int n , int r) { long double tempres = 1.0; if(n == r) { return 1; } else if(r == 1) { return n; } else { for(int i=1 ; i<=r ; i++) { tempres = (tempres * (n-r+i) / i) ; } return tempres; } }
本來我用遞迴做
馬上就被賞了個TLE
還是乖乖的邊乘邊除
ACM-160 Factors and Factorials with C++
#include<iostream> #include<stdio.h> #include<cstdio> using namespace std; void funct(int a , int b); int array[25]={ 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}; int buffer; int step; int main(int argc, char* argv[]) { int a; int b; while(cin != NULL) { cin>>a; //store the input if(a != 0) { printf("%3d! =",a); b = 0; step = 0; buffer = 0; while(a >= array[b]) { funct(a,b); b++; if(b == 25) break; } }else { break; } printf("\n"); } return 0; } void funct(int a , int b) { if(a >= array[b]) { buffer += a/array[b]; a = a/array[b]; funct(a,b); }else { step++; if(step == 16) { printf("\n "); step = 1; } printf("%3d",buffer); buffer = 0; } }
ACM-113 Power of Cryptography with C
#include <stdio.h> #include <math.h> int main(int argc, char* argv[]) { double n,p; double k; while (scanf("%lf %lf", &n, &p) == 2) { k = exp(log(p)/n); printf("%.0lf\n", k); } return 0; }
Wednesday, July 21, 2010
ACM-102 Ecological Bin Packing with C++
#include<iostream> #include<stdio.h> #include<cstdio> using namespace std; string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max); /********************************/ /* glass[a][b] */ /* a is bucket number */ /* b is glass color */ /* b = 1 Brown */ /* b = 2 Green */ /* b = 3 Clean */ /********************************/ int main(int argc, char* argv[]) { unsigned int Bucket[3][3]; int can_1, can_2, can_3; while (scanf("%d %d %d %d %d %d %d %d %d", &Bucket[0][0], &Bucket[0][1], &Bucket[0][2], &Bucket[1][0], &Bucket[1][1], &Bucket[1][2], &Bucket[2][0], &Bucket[2][1], &Bucket[2][2]) != EOF) { /* initiate */ unsigned int max = 0 , move = 0; int init = 0, total = 0, temp_total = 0; string s_goal = "XXX"; for(int i=0 ; i<3 ; i++) { for(int j=0 ; j<3 ; j++) { total = total + Bucket[i][j]; } } for(can_1=0 ; can_1<3 ; can_1++) { init = Bucket[0][can_1]; temp_total = Bucket[0][can_1]; for(can_2=0 ; can_2<3 ; can_2++) { if(can_1 != can_2) { temp_total = temp_total + Bucket[1][can_2]; for(can_3=0 ; can_3<3 ; can_3++) { if( (can_3 != can_2) && (can_3 != can_1) ) { temp_total = temp_total + Bucket[2][can_3]; if(temp_total >= max) { s_goal = funct(can_1 , can_2 , can_3 , s_goal , temp_total , max); max = temp_total; } temp_total = init; } } } } } move = total - max; cout<< s_goal << " " << move <<endl; } return 0; } string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max) { string str=""; int size = 0; if(c1==0){ str=str+"B"; }else if(c1==1){ str=str+"G"; }else str=str+"C"; if(c2==0){ str=str+"B"; }else if(c2==1){ str=str+"G"; }else str=str+"C"; if(c3==0){ str=str+"B"; }else if(c3==1){ str=str+"G"; }else str=str+"C"; if(temp == temp_max) { while(size < 2) { if(str[size] < s_temp[size]) return str; else if(str[size] > s_temp[size]) break; else size++; } return s_temp; } return str; }
Monday, July 19, 2010
ACM-101 The Blocks Problem with C++
經過了3天的激戰
順利的擊敗了ACM-101
執行時間0.020 排名2901
神人好多阿
順利的擊敗了ACM-101
執行時間0.020 排名2901
神人好多阿
#include <sstream> #include <iostream> #include <stdio.h> #include <ctype.h> #include <cstdio> #include <list> using namespace std; list <int> block[25]; // 25 stack int pos[25]; // if block 1 is in the stack and the base block is 5 then pos[1] = 5; void initiate(); void printresult(int x); void moveonto(int a , int b); void moveover(int a , int b); void pileonto(int a , int b); void pileover(int a , int b); bool checkblock(int a , int b); int main(int argc, char* argv[]) { int block_1, block_2; int final; string str1, str2; string quit = "quit"; string move = "move"; string pile = "pile"; string onto = "onto"; string over = "over"; while( cin>>str1 ) { if(str1 == quit)//print the final result { printresult(final); }else if(str1 == move || str1 == pile) // move and pile action { cin >> block_1 >> str2 >> block_2; if(block_1 != block_2 && checkblock(block_1 , block_2)) { if(str1 == move) { if(str2 == onto) { moveonto(block_1 , block_2); }else { moveover(block_1 , block_2); } }else { if(str2 == onto) { pileonto(block_1 , block_2); }else { pileover(block_1 , block_2); } } }else { //cout<<"Are you kidding"<<endl; } }else // how many blocks are used in the process { istringstream stream1; stream1.str(str1); stream1 >> final; initiate(); } } return 0; } void initiate() { for(int i=0 ; i<25 ; i++) { if(block[i].empty()) { block[i].push_back(i); pos[i] = i; }else { block[i].clear(); block[i].push_back(i); pos[i] = i; } } } void printresult(int x) { list<int>::iterator iter2; for(int y=0 ; y<x ; y++) { iter2 = block[y].begin(); cout << y <<":"; while( iter2 != block[y].end() ) { cout <<" "<<*iter2; ++iter2; } cout<<endl; } } bool checkblock(int a , int b) { if(pos[a] != pos[b]) return true; else return false; } void moveonto(int a , int b) { int temp_pos1, temp_pos2; //use to present the target block's position; //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1 int bpos1, bpos2; //use to present the last block in the stack; //if the stack is "1 2 3" then bpos = 3 /*** put the block back ***/ temp_pos1 = pos[a]; //where is the block a bpos1 = block[temp_pos1].back(); //the last block in the stack a temp_pos2 = pos[b]; //where is the block b bpos2 = block[temp_pos2].back(); //the last block in the stack b while(bpos1 != a) //put the last block back { block[bpos1].push_back(bpos1); pos[bpos1] = bpos1; block[temp_pos1].pop_back(); bpos1 = block[temp_pos1].back(); } while(bpos2 != b) //put the last block back { block[bpos2].push_back(bpos2); pos[bpos2] = bpos2; block[temp_pos2].pop_back(); bpos2 = block[temp_pos2].back(); } /*** move the first block onto the second block ***/ block[temp_pos1].pop_back(); block[temp_pos2].push_back(a); pos[a] = temp_pos2; } void moveover(int a , int b) { int temp_pos1, temp_pos2; //use to present the target block's position; //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1 int bpos1; //use to present the last block in the stack; //if the stack is "1 2 3" then bpos = 3 /*** put the block back ***/ temp_pos1 = pos[a]; //where is the block a bpos1 = block[temp_pos1].back(); //the last block in the stack a temp_pos2 = pos[b]; //where is the block b while(bpos1 != a) //put the last block back { block[bpos1].push_back(bpos1); pos[bpos1] = bpos1; block[temp_pos1].pop_back(); bpos1 = block[temp_pos1].back(); } /*** move the first block onto the second block ***/ block[temp_pos1].pop_back(); block[temp_pos2].push_back(a); pos[a] = temp_pos2; } void pileonto(int a , int b) { int temp_pos1, temp_pos2; //use to present the target block's position; //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1 int bpos2; //use to present the last block in the stack; //if the stack is "1 2 3" then bpos = 3 list<int> mylist; list<int>::iterator it; /*** put the block back ***/ temp_pos1 = pos[a]; //where is the block a //bpos1 = block[temp_pos1].back(); //the last block in the stack a temp_pos2 = pos[b]; //where is the block b bpos2 = block[temp_pos2].back(); //the last block in the stack b for(it=block[temp_pos1].begin() ; it!=block[temp_pos1].end() ; it++) { if(*it == a) { mylist.splice ( mylist.begin(), block[temp_pos1], it, block[temp_pos1].end()); break; } } while(bpos2 != b) //put the last block back { block[bpos2].push_back(bpos2); pos[bpos2] = bpos2; block[temp_pos2].pop_back(); bpos2 = block[temp_pos2].back(); //cout<<"*"; } block[temp_pos2].splice(block[temp_pos2].end(),mylist); for(it=block[temp_pos2].begin() ; it!=block[temp_pos2].end() ; it++) { pos[*it] = temp_pos2; } pos[a] = temp_pos2; } void pileover(int a , int b) { int temp_pos1, temp_pos2; //use to present the target block's position; //if the target block is "3" and the stack is "1 2 3" ; then temp_pos = 1 //int bpos1, bpos2; //use to present the last block in the stack; //if the stack is "1 2 3" then bpos = 3 list<int> mylist; list<int>::iterator it; /*** put the block back ***/ temp_pos1 = pos[a]; //where is the block a //bpos1 = block[temp_pos1].back(); //the last block in the stack a temp_pos2 = pos[b]; //where is the block b //bpos2 = block[temp_pos2].back(); //the last block in the stack b for(it=block[temp_pos1].begin() ; it!=block[temp_pos1].end() ; it++) { if(*it == a) { mylist.splice ( mylist.begin(), block[temp_pos1], it, block[temp_pos1].end()); break; } } block[temp_pos2].splice(block[temp_pos2].end(),mylist); for(it=block[temp_pos2].begin() ; it!=block[temp_pos2].end() ; it++) { pos[*it] = temp_pos2; } pos[a] = temp_pos2; }
Saturday, July 17, 2010
ACM-100 The 3n + 1 problem with C++
#include <iostream> using namespace std; int main(int argc, char* argv[]) { int a,b; int start,end; int temp,count; int max; while(cin >> a >> b) { //cout << a << b << endl; if(a > b) { start = b; end = a; }else { start = a; end = b; } max = 0; for(int k = start; k <= end ; k++) { temp = k; count = 1; while(temp!=1) { ++count; if(temp%2 ==1) { temp = 3 * temp + 1; }else { temp = temp / 2; } } if(max < count) { max = count; } } cout >> a >> " " >> b >> " " >> max >> endl; } return 0; }
TEST
public class HelloWorld{
public static void main(String args[]){
System.out.println("Hello World!");
}
}
Subscribe to:
Posts (Atom)