47 条题解
-
0wang_yanheng LV 10 @ 2014-08-07 11:40:39
/*---------------------------------------------
5个小时才搞定这坑爹的题啊~写了整整105行
一开始字符串没处理好,修理了2小时
后来减法竟然给我弄错了(把 a[i] 的结果记到 a[i-1] 去了)
最后调试完毕,坐等AC,结果5个点都WA
发现我竟把毛头的结果输出了!发表一下超长题解,无耐心者莫看
----------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <math.h>short indexOf(char *str,short index);
int toInt(char *str);
void add(char *delta,char *addTo,short pn);
void slice(char *from,char *to,short begin,short end);int main(){
char problem[200]="",temp[10]="",result[10]="";
int max,lines,correctAns;
short i,begin=0,end=0,count=0,flag=1;scanf("%d %d",&max,&lines);
for(i=0;i<lines;i++){
scanf("%s",problem);
strcpy(result,"0");
begin=end=correctAns=0;
while(problem[begin]!='='){
flag=1; //positive or negative
end=indexOf(problem,begin+1); //search for next operator
if(problem[begin]=='-') //judge p/n
flag=-1;
if(begin==0)
begin--;
slice(problem,temp,begin+1,end-1); //cut the number from string
correctAns+=toInt(temp)*flag; //change it into int and add to correct answer
/*deal with the fool's result*/
if(toInt(temp)>max || toInt(result)>max){
strcpy(result,"99999999");
break;
}
add(temp,result,flag==1);
if(toInt(temp)>max || toInt(result)>max){
strcpy(result,"99999999");
break;
}
/*end*/
begin=end;
}
if(correctAns==toInt(result))
count++;
}
printf("%d\n",count*1000/lines);
return 0;
}
short indexOf(char* str,short index){
for(;;index++)
if(str[index]=='+' || str[index]=='-' || str[index]=='=')
break;
return index;
}
int toInt(char str){
int i,base=1,ans=0;
for(i=strlen(str)-1;i>=0;i--){
ans+=base(str[i]-'0');
base*=10;
}
return ans;
}
void add(char *delta,char *addTo,short pn){
short i,carry,length;
if(toInt(delta)>10 || toInt(addTo)>10)
carry=0;
else
carry=1;
length=strlen(delta);
for(i=length;i>=0;i--)
delta[i+(9-length)]=delta[i];
for(i=0;i<9-length;i++)
delta[i]='0';
length=strlen(addTo);
for(i=length;i>=0;i--)
addTo[i+(9-length)]=addTo[i];
for(i=0;i<9-length;i++)
addTo[i]='0';
for(i=8;i>0;i--){
delta[i]-='0';
addTo[i]-='0';
if(pn){
if(delta[i]*addTo[i]==3){
addTo[i]=2;
}else{
if(carry)
addTo[i-1]+=(addTo[i]+delta[i])/10;
addTo[i]=(addTo[i]+delta[i])%10;
}
}else{
addTo[i-1]--;
addTo[i-1]+=(addTo[i]+10-delta[i])/10;
addTo[i]=(addTo[i]+10-delta[i])%10;
}
delta[i]+='0';
addTo[i]+='0';
}
}
void slice(char *from,char *to,short begin,short end){
short i=0;
for(;begin<=end;begin++){
to[i]=from[begin];
i++;
}
to[i]='\0';
} -
02012-08-17 14:23:31@
不好意思,前面我发的那个,直接发错了文件,大家无视。。。
#include
char trush[3000];
int max;
int sum(int pre,int beh)
{
int a=pre,b=beh;
while(a>0&&b>0)
{
int x=a%10,y=b%10;
if((x==1&&y==3)||(x==3&&y==1)||pre+beh>max)return -1;
a/=10;b/=10;
}
if((pre>9||beh>9)&&(pre%10+beh%10>9))return -1;
return pre+beh;
}
int main()
{
int tishu;
scanf("%d %d",&max,&tishu);
int i,right=0;
for(i=0;imax)
{
scanf("%s",trush);continue;
}
int flag=1;
for(;;)
if((c=getchar())!='=')
{
int beh;
scanf("%d",&beh);
if(beh>max)
{
scanf("%s",trush);
flag=0;
break;
}
if(c=='+')
if((pre=sum(pre,beh))==-1)
{
scanf("%s",trush);
flag=0;
break;
}
if(c=='-')pre-=beh;
}
else break;
if(flag)right++;
}
printf("%d",(int)(1000.0/tishu*right));
return 0;
} -
02009-10-24 14:13:27@
暴力破解!~~~~~~~~
1000可以被m整除
所以………………
case
答案是
数据 1 2 3 4 5
答案 500 400 400 600 525
凑一下m就可以了~~~
m可以为:1,2,5,10,40,200,1000,25,125,250,500;
呵呵……%%%正好1500次提交~~~~~~~~~~~~~~~~~~留念~~
-
02009-10-14 11:51:54@
做2个运算函数
一个标准函数
一个毛头运算函数
模拟出结果,如果一直则正确,不一致则错误。起码做了1个小时
还好1次AC
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-10-04 11:41:18@
哈哈,这题,实在是太牛了
-
02009-09-05 15:47:08@
第499个通过的……
20分钟编完,调试1小时,80行的程序,一次AC!!! -
02009-08-22 14:20:25@
居然1A了
太rp了 -
02009-08-11 17:59:33@
细心.....
千万注意这句话(尤其是只过前两个点的):毛头大于十的加数相加不会进位!
也就是说如果不进位就没事了..... -
02009-06-30 18:23:26@
-
02009-06-29 22:18:55@
我是出题者= =
现在已经是大学生了 看你们这些可爱的小朋友们还一直在努力着 真感动
其实这个题真的非常非常非常简单
但是考就考一个细心
要知道大家在正式比赛的时候 细心可是很重要的哦
大家加油~ -
02008-10-30 19:56:59@
真的变毛头了……
高精 or 字符串 都是可以的……看你拿手什么了
特别提醒:每题的得分是(1000 div m),而不是 100!
因为这个WA了两次莫名其妙……血的教训啊……
-
02008-10-16 09:02:22@
2.....搞掉了......
看了題先笑了半天........
搞來搞去一直八十五分又把我鬱悶了半天......(是真正意義上的半天 = =)
原來是一個BOOLEAN的初值沒有給.....哎...真佩服這出題的牛人XD
其實也沒什麽說的啦....對於這種理論簡單,過程繁瑣的題目,
首先腦子裏面不能亂了陣腳,心平氣和是唯一。
另外建議寫這種程序的時候盡量模塊化...不要追求行數少, -
02008-10-15 21:20:16@
搞了半天终于过了..
开始居然把ok=0打成bool ok=0;我都快成毛头了=.=
-
02008-09-27 20:57:48@
我和楼下一样哎.....
数据2 cscccd99能给一下吗?让我知道自己是怎么错的...
我菜菜的头脑已经把所有我想到的都考虑了 -
02008-09-24 20:57:40@
我测试数据2还让毛头多得了200分...不知WA在哪里...郁闷中...
-
02008-09-13 22:57:47@
我也交了两次!!:毛头虽说>10的加数不会进位,但是诸如:13+25=38 这类不用进位的他是能做对的,故不能一个加数>10就break(这一点一定要注意)
-
02008-09-11 13:31:55@
58行~弱弱地AC……
-
02008-07-26 13:42:17@
写完这个程序 我们自己都成毛头了
太猥琐了 BS出题的人 -
02007-11-06 10:34:53@
大家要小心,当减到0的时候,结果仍然算是正确的,不要被n的范围迷惑了.
-
02007-10-31 10:43:14@
同LS..可恶的千分制...
这道题最好把各种爆错的判断直接放在高精度中.一定要利用高精度的现成方法.
不管高精度,自己瞎编只能是自找麻烦..就像我...
处理好麻烦...