這題可以用中國剩余定理(這個我不會),我用的只是從1到105逐個搜索
[cpp]
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin>>a>>b>>c;
int n=(a*70+b*21+c*15)%105;
if(n>100||n<10) cout<<"No answer"<<endl;
else cout<<n<<endl;
return 0;
}
小明的調查作業 nyoj 48
此題根據規模進行,可以開一個a【1005】的數組,每讀一個i,
就把a【i】賦值為true,然後遍歷輸出,重復計算問題,也挺省時間的。
[cpp]
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n, num;
int count=0;
int vis[1005];
cin>>n;
memset(vis, 0, sizeof(vis));
while(n--)
{
cin>>num;
if(!vis[num])
{
vis[num]=1;
count++;
}
}
cout<<count<<endl;
for(int i=1;i<=1000;i++)
if(vis[i])
cout<<i<<" ";
cout<<endl;
return 0;
}
數的長度 nyoj 69
此題有一種很准確的方法叫斯特林(Stirling)公式;
還有一種也能行,不過數太大時就不是非常准確的方法:
for(int i=1;i<=m;i++)
num += log10(i);
就是對每個乘數取對數
[cpp]
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
int m;
double num = 0.0;
cin>>m;
for(int i=1;i<=m;i++)
num += log10(i);
cout<<(int)(num)+1<<endl;
}
return 0;
}
房間安排 nyoj 168
用數組a【201】存放第i天中每天需要的房間數,讀房間數、天數,然後找出數組中
最大的元素#include<algorithm>
int p = max_element(a, a+200)-a;
cout<<a[p]<<endl;
[cpp]
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[201]; //第i天的房間數
int main()
{
int T;
cin>>T;
while(T--)
{
memset(a, 0, sizeof(a));
int N, num, start, day;
cin>>N;
while(N--)
{
cin>>num>>start>>day;
for(int i=0;i<day;i++)
a[start+i] += num;
}
int p = max_element(a, a+200)-a;
cout<<a[p]<<endl;
}
return 0;
}
素數 nyoj 169
主函數部分設計的很巧妙,先近後遠,距離相等的話先大後小
[cpp]
#include<iostream>
using namespace std;
bool fan(int a)
{
bool b=true;
int i;
if(a==1)
b=false;
else
for(i=2;i<a;i++)
{
if(a%i==0)
{b=false;break;}
}
return b;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int m,i;
cin>>m;
for(i=0;;i++)
{
if(fan(m+i))
{cout<<m+i<<endl;break;}
if(fan(m-i))
{cout<<m-i<<endl;break;}
}
}
return 0;
}
字母統計 nyoj 241
此題類似重復計數,用一個數組保存,然後用‘a’+index;算是比較巧妙吧
[cpp]
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int num[26];
int main()
{
int N;
string str;
cin>>N;
while(N--)
{
memset(num, 0, sizeof(num));
cin>>str;
char ch;
for(int j=0;j<str.size();j++)
{
ch = str.at(j);
num[(int)(ch-'a')]++;
}
int max = num[0];
int index = 0;
for(int i=0;i<26;i++)
{
if(num[i] > max)
{
max = num[i];
index = i;
}
}
ch = 'a' + index;
cout<<ch<<endl;
}
return 0;
}
16進制的簡單運算 nyoj 244
傷心的代碼,我用c++寫了好長,人家兩句讀入輸出,換一下格式ok
scanf("%x%c%x", &a, &c, &b);
if(c == '+')
printf("%o\n", a+b);
if(c == '-')
printf("%o\n", a-b);
[cpp]
#include<iostream>
#include<string>
using namespace std;
int main()
{
int N;
string str;
cin>>N;
while(N--)
{
cin>>str;
char ch;
int num1 = 0;
int num2 = 0;
int temp;
int oper = str.find('+');
if(oper == -1)
oper = str.find('-');
for(int i=0;i<oper;i++)
{
ch = str.at(i);
num1 *= 16;
if(ch >= '0' && ch <= '9')
temp = ch - '0';
else if(ch >= 'a' && ch <= 'f')
temp = ch - 'a' + 10;
num1 += temp;
}
cout<<num1<<endl;
for(int i=oper+1;i<str.size();i++)
{
ch = str.at(i);
num2 *= 16;
if(ch >= '0' && ch <= '9')
temp = ch - '0';
else if(ch >= 'a' && ch <= 'f')
temp = ch - 'a' + 10;
num2 += temp;
}
cout<<num2<<endl;
ch = str.at(oper);
if(ch == '+')
{
num1 += num2;
}
else if(ch == '-')
{
num1 -= num2;
}
cout<<num1<<endl;
str = "";
while(num1)
{
str += ('0'+(num1 % 8));
num1 /= 8;
}
string s(str.rbegin(),str.rend());
cout << s <<endl;
}
return 0;
}
[cpp]
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
int a, b;
char c;
scanf("%x%c%x", &a, &c, &b);
if(c == '+')
printf("%o\n", a+b);
if(c == '-')
printf("%o\n", a-b);
}
return 0;
}
荷蘭國旗問題 nyoj 268
用三個數分別記下三個字母出現的次數,然後依序輸出就行了,他們提供的最優代碼也是這樣寫的
[cpp]
#include<iostream>
#include<string>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
string s1;
int a=0,b=0,c=0;
cin>>s1;
for(int i=0;i<s1.size();i++)
{
if(s1.at(i) == 'R')
{
a++;
}
else if(s1.at(i) == 'W')
b++;
else
c++;
}
for(int i=0;i<a;i++)
cout<<"R";
for(int i=0;i<b;i++)
cout<<"W";
for(int i=0;i<c;i++)
cout<<"B";
cout<<endl;
}
return 0;
}
正三角形的外接圓面積 nyoj 274
看一個叫做“寶”的仁兄的代碼,我覺得很好,收集一下:
[cpp]
#include <iostream>
using namespace std;
#define PI 3.1415926
int main()
{
int m;
cin>>m;
while(m--)
{
double s,a;
cin>>a;
s=PI*a*a/3.0;
cout.setf(ios_base::fixed);
cout.precision(2);
cout<<s<<endl;
}
return 0;
}
算菜價 nyoj 316
還是“寶”兄的代碼,不過這次他用了C
[cpp]
#include<stdio.h>
int main()
{
double a,b,sum=0;
char c[20];
while(scanf("%s%lf%lf",c,&a,&b)!=EOF)
{
sum=sum+a*b;
}
printf("%.1lf\n",sum);
return 0;
}
小光棍數 nyoj 458
第一個光棍數是471,第二個是1000+471,第三個是2000+471,總之是1000的整倍數加471(我不會證明。。。。)
[cpp]
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
long long int m;
cin>>m;
cout<<(m-1)*1000+471<<endl;
}
return 0;
} www.2cto.com
[cpp]
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long int n, m;
scanf("%lld", &n);
while(n--)
{
scanf("%lld", &m);
printf("%lld\n", (m-1)*1000+471);
}
return 0;
}
0