問題 A: 守形數
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 340 解決: 167
[送出][狀态][讨論版][命題人:外部導入]
題目描述
守形數是這樣一種整數,它的平方的低位部分等于它本身。
比如25的平方是625,低位部分是25,是以25是一個守形數。
編一個程式,判斷N是否為守形數。
輸入
輸入包括1個整數N,2<=N<100。
輸出
可能有多組測試資料,對于每組資料,
輸出"Yes!”表示N是守形數。
輸出"No!”表示N不是守形數。
樣例輸入
6
11
樣例輸出
Yes!
No!
代碼:
#include<iostream>
using namespace std;
const int N=1e4+1;
//n轉換為數組存到A[]裡 傳回數組長度
int int2array(int n,int A[]){
int index=0;
while(n){
A[index++]=n%10;
n/=10;
}
return index;
}
int main(){
int n,m;
int l1,l2;
int a1[N],a2[N];
bool flag;
while(cin>>n){
flag=true;
l1=int2array(n,a1);
l2=int2array(n*n,a2);
for(int i=0;i<l1;i++){
if(a1[i]!=a2[i]) flag=false;
}
if(flag){
cout<<"Yes!"<<endl;
}else{
cout<<"No!"<<endl;
}
}
return 0;
}
問題 B: 反序數
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 172 解決: 143
[送出][狀态][讨論版][命題人:外部導入]
題目描述
設N是一個四位數,它的9倍恰好是其反序數(例如:1234的反序數是4321)
求N的值
輸入
程式無任何輸入資料。
輸出
輸出題目要求的四位數,如果結果有多組,則每組結果之間以回車隔開。
答案:1089
#include<iostream>
using namespace std;
const int N=1e5;
//n轉換為數組存到A[]裡 傳回數組長度
int int2array(int n,int A[]){
int index=0;
while(n){
A[index++]=n%10;
n/=10;
}
return index;
}
int main(){
int l1,l2;
int a1[N],a2[N];
for(int i=1000;i<=9999;i++){
bool flag=true;
l1=int2array(i,a1);
l2=int2array(i*9,a2);
if(l1==l2){
for(int i=0;i<l1;i++){
if(a1[i]!=a2[l2-i-1]) {
flag=false;
break;
}
}
if(flag){
cout<<i<<endl;
}
}
}
return 0;
}
數學問題勤動筆
分數化整數,以免不必要的麻煩 先化簡方程,多麼簡單的思想
x+y+z=100
5x+3y+1/3*z<=n
即是:
x+y+z=100
15x+9y+z<=n
#include<iostream>
using namespace std;
int main(){
int x,y,z;
int n;
while(cin>>n){
n*=3;
for(x=0;x<=n/15&&x<=100;x++){//x<=n/5不是100/5 睡久了發昏了
for(y=0;y<=(n-15*x)/9&&y<=(100-x);y++){//x<=n/3不是100/3 睡久了發昏了
z=(100-x-y);
if(15*x+9*y+z<=n){
cout<<"x="<<x<<",y="<<y<<",z="<<z<<endl;
}
}
}
}
return 0;
}
問題 D: abc
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 141 解決: 131
[送出][狀态][讨論版][命題人:外部導入]
題目描述
設a、b、c均是0到9之間的數字,abc、bcc是兩個三位數,且有:abc+bcc=532。求滿足條件的所有a、b、c的值。
輸入
題目沒有任何輸入。
輸出
請輸出所有滿足題目條件的a、b、c的值。
a、b、c之間用空格隔開。
每個輸出占一行。
#include<iostream>
using namespace std;
int main(){
int a,b,c;
for(a=0;a<=9;a++){
for(b=0;b<=9;b++){
for(c=0;c<=9;c++){
int x=100*a+10*b+c;
int y=100*b+10*c+c;
if(x+y==532){
cout<<a<<" "<<b<<" "<<c<<endl;
}
}
}
}
return 0;
}
問題 E: 衆數
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 327 解決: 120
[送出][狀态][讨論版][命題人:外部導入]
題目描述
輸入20個數,每個數都在1-10之間,求1-10中的衆數(衆數就是出現次數最多的數,如果存在一樣多次數的衆數,則輸出權值較小的那一個)。
輸入
測試資料有多組,每組輸入20個1-10之間的數。
輸出
對于每組輸入,請輸出1-10中的衆數。
注意如果存在一樣多次數的衆數,則輸出權值較小的那一個。
樣例輸入
8 9 6 4 6 3 10 4 7 4 2 9 1 6 5 6 2 2 3 8
樣例輸出
6
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct KK
{
int value;
int count;
}kk[21];
bool cmp(KK k1,KK k2){
if(k1.count==k2.count) return k1.value<k2.value;
return k1.count>k2.count;
}
void clearKK(){
for(int i=1;i<=10;i++){
kk[i].value=i;
kk[i].count=0;
}
}
int main(){
int x,N=20;
while(cin>>x){
clearKK();
kk[x].count++;
for(int i=1;i<N;i++){
cin>>x;
kk[x].count++;
}
sort(kk+1,kk+11,cmp);
cout<<kk[1].value<<endl;//注意是kk[1]不是kk[0] 1~10排序的
}
return 0;
}
問題 F: 計算兩個矩陣的乘積
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 200 解決: 112
[送出][狀态][讨論版][命題人:外部導入]
題目描述
計算兩個矩陣的乘積,第一個是2*3矩陣,第二個是3*2矩陣,結果為一個2*2矩陣。
輸入
輸入包含多組資料,先輸入一個2*3矩陣,再輸入一個3*2矩陣。
輸出
輸出兩個矩陣的乘積。
樣例輸入
1 1 1
1 1 1
1 1
1 1
1 1
樣例輸出
3 3
3 3
好多年沒看數學了,矩陣運算都快忘了,唉!
#include<iostream>
using namespace std;
int main(){
int a[2][3],b[3][2],c[2][2];
while(cin>>a[0][0]){
//輸入a[]
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
if(i==0&&j==0) continue;
cin>>a[i][j];
}
}
//輸入b[]
for(int i=0;i<3;i++){
for(int j=0;j<2;j++){
cin>>b[i][j];
}
}
//計算a[]*b[]
for(int i=0;i<2;i++){//A[i][j] A的行
for(int k=0;k<2;k++){//B[j][k] B的列
int ans=0;
for(int j=0;j<3;j++){ //A的列 (A列==B行)
ans+=a[i][j]*b[j][k];
}
c[i][k]=ans;
}
}
//輸入結果c[]
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
cout<<c[i][j]<<" ";
}
cout<<endl;
}
}
return 0;
}
問題 H: 整數和
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 138 解決: 103
[送出][狀态][讨論版][命題人:外部導入]
題目描述
編寫程式,讀入一個整數N。若N為非負數,則計算N 到2N 之間的整數和;若N為一個負數,則求2N 到N 之間的整數和。
輸入
第一行表示樣例數m,接下來m行每行一個整數N,N的絕對值不超過100。
輸出
輸出m行,每行表示對應的題目所求。
樣例輸入
2
2
-1
樣例輸出
9
-3
提示
注意N可能為負數
#include<iostream>
using namespace std;
int main(){
int m,n,sum;
cin>>m;
while(m--){
cin>>n;
sum=0;
if(n<0){
for(int i=2*n;i<=n;i++){
sum+=i;
}
}else{
for(int i=n;i<=2*n;i++){
sum+=i;
}
}
cout<<sum<<endl;
}
return 0;
}
問題 J: 多項式的值
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 149 解決: 95
[送出][狀态][讨論版][命題人:外部導入]
題目描述
實作一個多項式的類(a+b*x+c*x^2+d*x^3+...+),要求輸入該多項式的系數和x
的值後列印出這個多項式的值。
輸入
輸入第一行為樣例數m,對于每個樣例,第一行為多項式最高項次數n,接下來n+1個整數表示每項系數,最後一個整數x,n不超過10。
輸出
輸出m行,表示個多項式代入x後的值。
樣例輸入
1
2
1 2 3
2
樣例輸出
17
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double x,a[101],fx;
int n,m;
cin>>m;
while(m--){
cin>>n;
fx=0;
for(int i=0;i<=n;i++){
cin>>a[i];
}
cin>>x;
for(int i=0;i<=n;i++){
fx+=a[i]*pow(x,i);
}
cout<<fx<<endl;
}
return 0;
}
問題 K: 疊代求立方根
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 126 解決: 98
[送出][狀态][讨論版][命題人:外部導入]
題目描述
立方根的逼近疊代方程是 y(n+1) = y(n)*2/3 + x/(3*y(n)*y(n)),其中y0=x.求給定的x經過n次疊代後立方根的值。
輸入
輸入有多組資料。
每組一行,輸入x n。
輸出
疊代n次後的立方根,double精度,保留小數點後面六位。
樣例輸入
4654684 1
65461 23
樣例輸出
3103122.666667
40.302088
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n;
double x,y;
while(cin>>x>>n){
y=x;
while(n--){
y=y*2/3+x/(3*y*y);
}
printf("%.6f\n",y);
}
return 0;
}
問題 L: 與7無關的數
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 116 解決: 100
[送出][狀态][讨論版][命題人:外部導入]
題目描述
一個正整數,如果它能被7整除,或者它的十進制表示法中某個位數上的數字為7,
則稱其為與7相關的數.現求所有小于等于n(n<100)的與7無關的正整數的平方和。
輸入
案例可能有多組。對于每個測試案例輸入為一行,正整數n,(n<100)
輸出
對于每個測試案例輸出一行,輸出小于等于n的與7無關的正整數的平方和。
樣例輸入
6
12
18
樣例輸出
91
601
1575
#include<iostream>
using namespace std;
bool notRefre(int n){
if(n%7==0) return false;
while(n){
if(n%10==7) return false;
n/=10;
}
return true;
}
int main(){
int n,sum;
while(cin>>n){
sum=0;
for(int i=1;i<=n;i++){
if(notRefre(i)) sum+=i*i;
}
cout<<sum<<endl;
}
return 0;
}
問題 M: 雞兔同籠
時間限制: 1 Sec 記憶體限制: 32 MB
送出: 144 解決: 121
[送出][狀态][讨論版][命題人:外部導入]
題目描述
一個籠子裡面關了雞和兔子(雞有2隻腳,兔子有4隻腳,沒有例外)。已經知道了籠子裡面腳的總數a,問籠子裡面至少有多少隻動物,至多有多少隻動物。
輸入
第1行是測試資料的組數n,後面跟着n行輸入。每組測試資料占1行,每行一個正整數a (a < 32768)
輸出
樣例輸入
2
18
5
樣例輸出
5 9
0 0
提示
這個問題可以描述成任給一個整數 N,如果N 是奇數,輸出0 0,否則如果N 是4 的倍數,
輸出N / 4 N / 2,如果N 不是4 的倍數,輸出N/4+1 N/2。這是一個一般的計算題,
隻要實作相應的判斷和輸出代碼就可以了。題目中說明了輸入整數在一個比較小的範圍内,
是以隻需要考慮整數運算就可以了。
分析一下很簡單,循環都不要,O(1)的算法
#include<iostream>
using namespace std;
int main(){
int x,y,z,a;
int T;
cin>>T;
while(T--){
cin>>a;
if(a%2!=0) cout<<"0 0\n";
else if(a%4==0){
cout<<a/4<<" "<<a/2<<endl;
}else{
cout<<a/4+1<<" "<<a/2<<endl;
}
}
return 0;
}