emmm算是打表吧
搞出了明明把一千以内的对应火柴根数都安排上了,结果数组大小只有100的乌龙,全部RE。
因为n<=24所以暴力点也无妨
有递归标签所以应该是要用递归优化一下的
#include<stdio.h>
int matches[1000]={6,2,5,5,4,5,6,3,7,6};
int n;
int main()
{
for(int x=1;x<10;x++){
for(int y=x*10;y<x*10+10;y++){
matches[y]=matches[x]+matches[y%10];
}
}
for(int x=1;x<10;x++){//百位数从1到9
for(int y=x*100;y<x*100+100;y++){//从100数到199...200数到299...
matches[y]=matches[x]+matches[y%100/10]+matches[y%10];
}
}
int sum=0;
scanf("%d",&n);
for(int i=0;i<1000;i++){
for(int j=0;j<1000;j++){
if(i+j<1000&&matches[i]+matches[j]+matches[i+j]+4==n){
//printf("%d+%d=%d\n",i,j,i+j);
sum++;
}
}
}
//printf("%d\n",matches[711]);
printf("%d",sum);
return 0;
}
19.8.23
P1085 不高兴的津津
#include<stdio.h>
int main()
{
int school,extra,i,sum,box;
box=0;
for(i=1;i<=7;i++){
scanf("%d %d",&school,&extra);
sum=school+extra;
if(sum>8&&box==0)
box=i;
}
printf("%d",box);
return 0;
}
P1089 津津的储蓄计划
两个问题:
1.读错题
2.在最后计算中漏掉了手上的余额
3.x是多余的,在修改时加上的,但最终没用上
#include<stdio.h>
int main()
{
int month,i,budget,surplus,box,mother,x;
mother=0;
surplus=0;
box=0;
i=0;
for(month=1;month<=12;month++){
surplus+=300;
scanf("%d",&budget);
if(budget>surplus&&box==0)
box=month;
else surplus-=budget;
if(surplus>=100){
i=surplus/100*100;
surplus-=i;
mother+=i;
}
}
if(box!=0)
printf("-%d",box);
else{
mother*=1.2;
printf("%d",mother+surplus);
}
return 0;
}
P1909 买铅笔
两个问题:
1.弄错了输出,一开始写了输出money
2.考虑不周全,原先写法完全忽略了购买总数小于单份包装铅笔数量的情况,导致一部分AC一部分WA……加个数量判断之后让上述情况的购买份数=1,AC。
#include<stdio.h>
int main()
{
int n,x,p,i,y,money,min;
min=0;
scanf("%d",&n);
for(i=1;i<=3;i++){
scanf("%d %d",&x,&p);
if(n>=x){
if(n%x!=0) y=n/x+1;
else y=n/x;
}
else y=1;
money=y*p;
if(min==0||money<min)
min=money;
}
printf("%d",min);
return 0;
}
19.8.24
P1008 三连击
1.不知道怎么确保三个三位数的各位数互不相同(或者说能想到的办法中变量太多了)
2.通过这道题熟悉了数组的使用及各位数的求法
3.实际上还是看了题解
#include<stdio.h>
int main()
{
int i,j,k,n,flag;
for(i=123;i<=329;i++){
j=i*2;
k=i*3;
flag=1;
int a[10]={0};
a[i/100]++;
a[(i%100)/10]++;
a[i%10]++;
a[j/100]++;
a[(j%100)/10]++;
a[j%10]++;
a[k/100]++;
a[(k%100)/10]++;
a[k%10]++;
for(n=01;n<10;n++)
if(a[n]!=1)
flag=0;
if(flag==1)
printf("%d %d %d\n",i,j,k);
}
return 0;
}
P1423 小玉在游泳
连浮点数输入输出的写法都没搞明白
scanf("%lf",&a); //输入
printf("%f",a); //输出
#include<stdio.h>
int main()
{
int step,first;
first=2;
double x,y,z; //要游的目标距离,实际游的距离
y=first;
z=first;
double i=0.98;
scanf("%lf",&x);
for(step=1;y<x;step++){
z=z*i;
y+=z;}
printf("%d",step);
return 0;
}
P1424 小鱼的航程(改进版)
一开始看到n的范围以为用long……?然后一片WA……
改成int之后就AC了
原本想用数组给每一天插旗再遍历累加
然而最后用了纯数学方法,没用上循环……
#include<stdio.h>
int main()
{
int x,sum,i,j;
int n,y;//n天,y完整周
scanf("%d %d",&x,&n);
i=7-x+1;
if(x<=5) sum=250*(5-x+1);
else sum=0;
y=(n-i)/7;
sum+=y*5*250;
j=(n-i)%7;
if(j>5) sum+=5*250;
else sum+=j*250;
printf("%d",sum);
return 0;
}
P1980 计数问题
求位数那里应该可以用循环写,毕竟有规律
那么多个if实在是傻了吧唧的
回头再改改
#include<stdio.h>
int main()
{
int n,x,i,sum,flag;
sum=0;
scanf("%d %d",&n,&x);
int a[n+1]={0};
for(i=1;i<=n;i++){
flag=9;
a[i]=i;
if(a[i]/100000000!=0&&flag==9) flag=8;
if(a[i]/10000000!=0&&flag==9) flag=7;
if(a[i]/1000000!=0&&flag==9) flag=6;
if(a[i]/100000!=0&&flag==9) flag=5;
if(a[i]/10000!=0&&flag==9) flag=4;
if(a[i]/1000!=0&&flag==9) flag=3;
if(a[i]/100!=0&&flag==9) flag=2;
if(a[i]/10!=0&&flag==9) flag=1;
if(a[i]/10==0&&flag==9) flag=0;
switch(flag){
case 8:
if (a[i]%1000000000/100000000==x) sum++;
case 7:
if (a[i]%100000000/10000000==x) sum++;
case 6:
if (a[i]%10000000/1000000==x) sum++;
case 5:
if (a[i]%1000000/100000==x) sum++;
case 4:
if (a[i]%100000/10000==x) sum++;
case 3:
if (a[i]%10000/1000==x) sum++;
case 2:
if (a[i]%1000/100==x) sum++;
case 1:
if (a[i]%100/10==x) sum++;
case 0:
if (a[i]%10/1==x) sum++;
}
}
printf("%d",sum);
return 0;
}
19.8.25
P2141 珠心算测验
WA了五六次才……
难点在于算出来的和有没有被“翻过牌”
然后看了题解才知道可以用另一个数组当牌记录
解决这个之后又因为以下原因WA
1.忘记初始化ans
2.忘记输入数据没有按大小依次排列,导致和的检查写成了从被加数后面的数开始
3.把和的检查改成从a[1]开始之后顺手把被加数也改成了从a[1]开始……调试后才发现1+1重复了,而事实上我是按照1+2,1+3,1+4;2+3,2+4;3+4这样来算的
#include <stdio.h>
int main()
{
int n,i,j,k,ans;
ans=0;
scanf("%d",&n);
int a[n+1],b[n+1];
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=2;
}
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++){
for(k=1;k<=n;k++){
if(a[i]!=0&&a[j]!=0&&a[i]+a[j]==a[k]&&b[k]==2) {
ans++;
b[k]=1;
}
}
}
}
printf("%d",ans);
return 0;
}