博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
特殊篮子问题——C语言暴力破解
阅读量:4970 次
发布时间:2019-06-12

本文共 3192 字,大约阅读时间需要 10 分钟。

         You are given N baskets of gold coins. The baskets are numbered from 1 to N. In all except one of the baskets, each gold coin weighs w grams. In the one exceptional basket, each gold coin weighs w-d grams. A wizard appears on the scene and takes 1 coin from Basket 1, 2 coins from Basket 2, and so on, up to and including N-1 coins from Basket N-1. He does not take any coins from Basket N. He weighs the selected coins and concludes which of the N baskets contains the lighter coins. Your mission is to emulate the wizard's computation. Input The input file will consist of one or more lines; each line will contain data for one instance of the problem. More specifically, each line will contain four positive integers, separated by one blank space. The first three integers are, respectively, the numbers N, w, and d, as described above. The fourth integer is the result of weighing the selected coins. N will be at least 2 and not more than 8000. The value of w will be at most 30. The value of d will be less than w. Output For each instance of the problem, your program will produce one line of output, consisting of one positive integer: the number of the basket that contains lighter coins than the other baskets. Sample Input 10 25 8 1109 10 25 8 1045 8000 30 12 959879400 Sample Output 2 10 50

翻译:

你得到N篮金币。篮子的编号从1到n,除了一个篮子外,每个金币重w克。在一个特殊的篮子里,每枚金币重量为w-d克。一个巫师出现在场景中,从篮子1中取出1枚硬币,从篮子2中取出2枚硬币,以此类推,直到并包括从篮子N-1中取出N-1枚硬币。他不会从篮子里拿任何硬币。他会称出所选的硬币,并得出结论:在N个篮子里,哪一个篮子里的硬币较轻。您的任务是模拟向导的计算。

输入

输入文件将由一行或多行组成;每行将包含问题的一个实例的数据。更具体地说,每行将包含四个正整数,由一个空格分隔。前三个整数分别是数字N、w和d,如上所述。第四个整数是称重所选硬币的结果。

N至少是2,不超过8000。w的值最多为30。d的值小于w。

输出

对于问题的每个实例,您的程序将生成一行输出,其中包含一个正整数:包含比其他篮子更轻硬币的篮子的数量。

样例输入

10 25 8 110910 25 8 10458000 30 12 9599400

样例输出

21050

思路:暴力破解,按顺序从1到N-1,假设它是特殊的篮子,进行求和,如果求和结果跟输入的相同,就说明假设成立,如果假设都不成立,因为没考虑最后一个(N),说明N是特殊的篮子,另外,N<8000,涉及到大数加法,这里是用char*字符串进行模拟,用string操作简单一些

#include
#include
#include
char* trans(char a[]) { //字符串倒叙 char ch; for (int i = 0; i < strlen(a)/2; i++) { ch = a[i]; a[i] = a[strlen(a) - i - 1]; a[strlen(a) - i - 1] = ch; } return a;}char* add(char a[], char b[]) { //把2个字符串相加 while (strlen(a) != strlen(b)) { int al = strlen(a), bl = strlen(b); if (al > bl) b[bl] = '0'; else a[al] = '0'; a[al+1] = b[bl+1] = '\0'; } a[strlen(a)]=b[strlen(b)] = '\0'; int up = 0, sum; //up储存进位 char c[1000]; int i = 0; for ( ; i < strlen(a); i++) { //使用字符串模拟大数加法 sum = a[i] - '0' + b[i] - '0' + up; up = sum / 10; sum %= 10; c[i] = char(sum+'0'); c[i + 1] = '\0'; } if (up > 0) { c[i] = up + '0'; c[i + 1] = '\0'; } return c;}int main(){ int N, w, d; char sum[1000]="0", result[1000]; int flag; //用于记录是否有假设成立 char tmp[1000]; while (1) { flag = 1; scanf("%d%d%d%s", &N, &w, &d, &result); int i = 1; for (; i < N; i++) { //假设第i个篮子是特殊的 strcpy(sum, "0"); //重置sum for (int j = 1; j < N; j++) { if (i == j) itoa((w - d)*j, tmp, 10); else itoa(w*j, tmp, 10); strcpy(sum, trans(add(trans(sum), trans(tmp)))); } if (strcmp(sum, result) == 0) { flag = 0; printf("%d\n", i); break; } } if (flag) printf("%d\n", N); } return 0;}

 

转载于:https://www.cnblogs.com/F-itachi/p/9974337.html

你可能感兴趣的文章
mysql upper() 函数
查看>>
单片机复位电路
查看>>
php json_decode失败,返回null
查看>>
oracle 分页
查看>>
助教学期总结
查看>>
绘制基本 图形之矩形与多边形
查看>>
3-day3-list-truple-map.py
查看>>
Edit控件显示多行文字
查看>>
JS第二周
查看>>
dataTable.NET的search box每輸入一個字母進行一次檢索的問題
查看>>
Python 文件处理
查看>>
邻接表详解
查看>>
服务器一:分布式服务器结构
查看>>
迭代dict的value
查看>>
eclipse package,source folder,folder区别及相互转换
查看>>
Py 可能是最全面的 python 字符串拼接总结(带注释版)
查看>>
《Java程序设计实验》 软件工程18-1,3 OO实验2
查看>>
【Herding HDU - 4709 】【数学(利用叉乘计算三角形面积)】
查看>>
【7-9 有重复的数据I (20 分)】【此题卡输入,需要自己写个输入挂】
查看>>
JRebel安装部署,激活
查看>>