XDOJ_1007解题报告
2011-11-20 14:03
267 查看
题目描述:[高精度][二进制][ 1的个数]
Xi Dian Online Judge 1007 做一名正气的西电人
两人各写一个数字,然后转化为二进制,谁的数字中二进制1多谁就比较正气。
Input 输入包含多组数据,EOF结束。 每组数据包含两行,代表两个非负整数a,b(0<=a,b<10^100,不含前导0),a为wm写的数字,b为zyf写的数字。
Output 每组数据输出一行,输出正气的西电人名字"wm"或"zyf",如果两人的数字中二进制1一样多就输出"neither"。
自己的程序:
感觉程序挺混乱的。。就是。。main函数很复杂。。以至于x轩都不愿意帮我改代码了。。虽然是分出来了一个函数,还是超级复杂。多次调用的函数也是具有很高的复杂度,语句混乱多个语句实现简单意思。。还需改进。。
收获:c语言的字符串读取一直很蛋疼,总是为了稳定要自己一个一个字符读取,最后还是搞出了麻烦,复杂程度高,难以预测,不能保证稳定性呢。。
复杂的高精度运算给我弄的更加复杂了还需要继续努力啊!
X轩的程序(15分钟哎。。):
Xi Dian Online Judge 1007 做一名正气的西电人
两人各写一个数字,然后转化为二进制,谁的数字中二进制1多谁就比较正气。
Input 输入包含多组数据,EOF结束。 每组数据包含两行,代表两个非负整数a,b(0<=a,b<10^100,不含前导0),a为wm写的数字,b为zyf写的数字。
Output 每组数据输出一行,输出正气的西电人名字"wm"或"zyf",如果两人的数字中二进制1一样多就输出"neither"。
自己的程序:
#include <stdio.h> int start,end; char arr[1031000]; int procedure(char arr[]){ //除以一次2求余 int p,n=0;p=start; while (p<=end){ if (p==end){ if (arr[p]=='0') start++; else { n=(arr[p]-'0')%2; arr[p]=(arr[p]-'0')/2+'0';} } else { if (arr[p]<'2'){ if (p==start) start++; arr[p+1]+=(arr[p]-'0')*10; } else { arr[p+1]+=(arr[p]-'0')%2*10; arr[p]=(arr[p]-'0')/2+'0'; } } p=p+1; } return n; } int main(){ int n=0,sum1=0,sum2=0; char ch; while (scanf("%s",arr)!=EOF){ n=strlen(arr);sum1=0;sum2=0; start=0;end=n-1; while (start<=end) sum1+=procedure(arr); scanf("%s",arr); start=0;n = strlen(arr);end=n-1; while (start<=end) sum2+=procedure(arr); if (sum1>=sum2) if (sum1==sum2) printf("neither\n"); else printf("wm\n"); else printf("zyf\n"); } return 0; }
感觉程序挺混乱的。。就是。。main函数很复杂。。以至于x轩都不愿意帮我改代码了。。虽然是分出来了一个函数,还是超级复杂。多次调用的函数也是具有很高的复杂度,语句混乱多个语句实现简单意思。。还需改进。。
收获:c语言的字符串读取一直很蛋疼,总是为了稳定要自己一个一个字符读取,最后还是搞出了麻烦,复杂程度高,难以预测,不能保证稳定性呢。。
复杂的高精度运算给我弄的更加复杂了还需要继续努力啊!
X轩的程序(15分钟哎。。):
#include<stdio.h> #include<string.h> char str1[300],str2[300]; int work(char * str); void init(void) { int l1,l2; while (scanf("%s%s",str1,str2) != EOF) { l1 = work(str1); l2 = work(str2); if (l1 > l2) printf("wm\n"); else if (l1 < l2) printf("zyf\n"); else printf("neither\n"); } } int work(char * str) { int num[300],len = strlen(str),sum = 0,i,j; for(i = 1;i <= len;i++) num[i] = str[len-i] - '0'; while (len > 0) { for(i = len;i > 1;i--) { num[i-1] += (num[i] % 2) * 10; num[i] /= 2; } sum += num[1] % 2; num[1] /= 2; while (num[len] == 0) len--; } return sum; } int main() { init(); return 0; }main里面只有一个过程,显得很紧凑没有冗余的内容,是高精度的比较标准的程序了。字符串的输入 字符数组再转为数字数组 方便解决 倒序解决,解决一般情况后再解决特殊情况是循环构造的必要途径,方便检查,不容易出错。。
相关文章推荐
- ACM pku 1007 解题报告(给像我一样的新手们的忠告)
- poj 1007 DNA Sorting 解题报告
- poj 1007 DNA Sorting 解题报告
- 人民大学云计算编程的网上评估平台--解题报告 1004-1007
- 【原】 POJ 1007 DNA Sorting 逆序数 解题报告
- POJ 1007(无序度 排序) 解题报告
- PAT(Advance Level) 1007 Maximum Subsequence Sum 解题报告
- 人民大学云计算编程的网上评估平台--解题报告 1004-1007
- POJ1007解题报告
- POJ 1007(无序度 排序) 解题报告
- POJ 1007 DNA Sorting [解题报告] Java
- BZOJ 1007 几何 解题报告
- POJ 1007解题报告
- XDOJ 1036解题报告
- XDOJ_1001解题报告
- POJ_1007:DNA Sorting解题报告
- poj 1007 DNA Sorting 解题报告
- Pku acm 1007 DNA Sorting 排序算法解题报告(五)----求逆序数 排序
- POJ 1007 解题报告 DNA Sorting
- HDU 4667 Building Fence 解题报告