目录
B1001 害死人不偿命的(3n+1)猜想
代码:
#include<cstdio>
int main(void)
{
int n;
int temp=0;
scanf("%d",&n);
while(n!=1)
{
if(n%2==0)
{
n=n/2;
temp++;
continue;
}
n=(n*3+1)/2;
temp++;
}
printf("%d\n",temp);
return 0;
}
B1032 挖掘机技术哪家强
代码:
#include<cstdio>
int school[100005];
int main(void)
{
int n,sch,number;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&sch,&number);
school[sch]+=number;
}
int max_x,max;
max=-1;
for(int i=1;i<=n;i++)
{
if(school[i]>max)
{
max_x=i;
max=school[i];
}
}
printf("%d %d",max_x,max);
return 0;
}
问题B: 找X
代码:
#include<cstdio>
int a[205];
int main(void)
{
int n;
int i;
int x;
int x_x;
int temp;
while(scanf("%d",&n)!=EOF)
{
temp=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&x);
for(i=0;i<n;i++)
{
if(x==a[i])
{
x_x=i;
temp=1;
printf("%d\n",x_x);
break;
}
}
if(!temp)
{
printf("-1\n");
}
}
return 0;
}
进一步的优化
#include<cstdio>
int a[205];
int main(void)
{
int n;
int i;
int x;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&x);
for(i=0;i<n;i++)
{
if(x==a[i])
{
printf("%d\n",i);
break;
}
}
if(i==n)
{
printf("-1\n");
}
}
return 0;
}
B1036 跟奥巴马一起编程
问题分析:
当列数是偶数时,行数等于列数的一半。
当列数是奇数时,行数等于列数的一半再加1。
代码
#include<cstdio>
int main(void)
{
int n,i,j;
int lie;//空格列的个数
int hang;//空格行的个数
char a;
scanf("%d %c",&n,&a);
for(i=1;i<=n;i++)
{
printf("%c",a);
}
lie=n-2;
if(n%2==0)
hang=n/2;
else
hang=n/2+1;
printf("\n");
hang=hang-2;
for(i=1;i<=hang;i++)
{
printf("%c",a);
for(j=1;j<=lie;j++)
printf(" ");
printf("%c\n",a);
}
for(i=1;i<=n;i++)
{
printf("%c",a);
}
return 0;
}
问题 A: 日期差值
问题分析:
先假设第一个日期大(如果不是就互换)
让第一个的日期一直加1直到等于第二个日期。
为了方便直接取出每个月的天数,不妨给定一个二维数组int month[13][2],用来存放
每个月的天数,其中第二维为0时表示平年,为1时表示闰年。
代码如下:
#include<cstdio>
int month[13][2]=
{
{
0,0},//当二维为0时代表平年,当二维为1时代表润年,
{
31,31},//一月
{
28,29},//二月
{
31,31},//3
{
30,30},//4
{
31,31},//5
{
30,30},//6
{
31,31},//7
{
31,31},//8
{
30,30},//9
{
31,31},//10
{
30,30},//11
{
31,31}//12
};
bool panduan(int year)
{
return (year%4==0 && year%100!=0) || (year%400==0);
}
int main(void)
{
int temp;
int a1,a2;
int y1,m1,d1;
int y2,m2,d2;
while( scanf("%d %d",&a1,&a2) != EOF )
{
if(a1>a2)
{
temp=a2;
a2=a1;
a1=temp;
}
temp=1;
y1=a1/10000;
m1=(a1/100)%100;
d1=a1%100;
y2=a2/10000;
m2=(a2/100)%100;
d2=a2%100;
//while( y1!=y2 || m1!=m2 || d1!=d2 )
while( y1<y2 || m1<m2 || d1<d2 )
{
d1++;
if(d1==month[m1][panduan(y1)]+1)
{
m1++;
d1=1;
}
if(m1==13)
{
y1++;
m1=1;
}
temp++;
}
printf("%d\n",temp);
}
return 0;
}
如果想提升运行速度,只需把第一个的年份不断加1,直到与第二个日期的年份相差为1。
天数按照平/闰年的天数来加365或366。
年份相差为1是因为第一个日期的月日可能比第二个日期的月日大。
代码如下:
#include<cstdio>
int month[13][2]=
{
{
0,0},//当二维为0时代表平年,当二维为1时代表润年,
{
31,31},//一月
{
28,29},//二月
{
31,31},//3
{
30,30},//4
{
31,31},//5
{
30,30},//6
{
31,31},//7
{
31,31},//8
{
30,30},//9
{
31,31},//10
{
30,30},//11
{
31,31}//12
};
bool panduan(int year)
{
return (year%4==0 && year%100!=0) || (year%400==0);
}
int main(void)
{
int temp;
int a1,a2;
int y1,m1,d1;
int y2,m2,d2;
while( scanf("%d %d",&a1,&a2) != EOF )
{
if(a1>a2)
{
temp=a2;
a2=a1;
a1=temp;
}
temp=1;
y1=a1/10000;
m1=(a1/100)%100;
d1=a1%100;
y2=a2/10000;
m2=(a2/100)%100;
d2=a2%100;
while(y1<(y2-1)) //提升速度
{
if(panduan(y1))
temp+=366;
else
temp+=365;
y1++;
}
//while( y1!=y2 || m1!=m2 || d1!=d2 )
while( y1<y2 || m1<m2 || d1<d2 )
{
d1++;
if(d1==month[m1][panduan(y1)]+1)
{
m1++;
d1=1;
}
if(m1==13)
{
y1++;
m1=1;
}
temp++;
}
printf("%d\n",temp);
}
return 0;
}
进制转换
题目:对于一个P进制的数,如果要转换为Q进制。
分为两步:
- 将P进制数x转换成为十进制数y
- 将十进制数y转换成Q进制数z
代码如下:
#include<cstdio>
int main(void)
{
int P,Q,x;
int x_D=0;
int x_Q[30]={
0};
int product=1;
int i=0;
printf("请输入P:");
scanf("%d",&P);
printf("请输入x:");
scanf("%d",&x);
printf("请输入Q:");
scanf("%d",&Q);
while(x!=0)
{
x_D=x_D+(x%10)*product;
x=x/10;
product=product*P;
}
printf("%d\n",x_D);
while(x_D!=0)
{
x_Q[i]=x_D%Q;
x_D/=Q;
i++;
}
for(;i>=0;i--)
{
printf("%d",x_Q[i]);
}
return 0;
}
B1022 D进制的A+B
代码如下:
#include<cstdio>
int main(void)
{
int A,B,D,sum,i;
int a[100]={
0};
scanf("%d%d%d",&A,&B,&D);
sum=A+B;
i=0;
if(sum==0)
{
printf("0\n");
return 0;
}
while(sum!=0)
{
a[i++]=sum%D;
sum=sum/D;
}
i--;
for(;i>=0;i--)
{
printf("%d",a[i]);
}
return 0;
}
或者这样更好
#include<cstdio>
int main(void)
{
int A,B,D,sum,i;
int a[100]={
0};
scanf("%d%d%d",&A,&B,&D);
sum=A+B;
i=0;
do
{
a[i++]=sum%D;
sum=sum/D;
}while(sum!=0);
i--;
for(;i>=0;i--)
{
printf("%d",a[i]);
}
return 0;
}
问题 I: 【字符串】回文串
代码如下:
#include<cstdio>
#include<cstring>>
bool judge(char a[],int len)
{
int i=0;
for(i=0;i<len/2;i++)
{
if(a[i]!=a[len-1-i])
return false;
}
return true;
}
int main(void)
{
char a[256];
gets(a);
if(judge(a,strlen(a)))
printf("YES\n");
else
printf("NO\n");
return 0;
}
B1009 说反话
方法一
#include<cstdio>
int main(void)
{
int num=0;
char ans[90][90];
while( scanf("%s",ans[num]) != EOF )
{
num++;
}
for(int i=num-1;i>=0;i--)
{
printf("%s",ans[i]);
if(i>0)
printf(" ");
}
return 0;
}
方法二:
#include<stdio.h>
#include<string.h>
int main(void)
{
int num=0;
int i,h;
char a[90];
char ans[90][90];
gets(a);
for(i=0;i<strlen(a);i++)
{
if(a[i]!=' ')
{
ans[num][h++]=a[i];
}
else
{
ans[num][h]='\0';
num++;
h=0;
}
}
for(i=num;i>=0;i--)
{
printf("%s",ans[i]);
if(i>0)
printf(" ");
}
return 0;
}