大佬可以再看看这个吗?作业最后一题。我只对了三个点。。。

360U3188835312 |浏览946次
收藏|2020/03/20 09:09

满意回答

2020/03/20 09:21

#include <stdio.h>#include <stdlib.h>void number(char *t, int num) {if (t[num] < '0') {t[num] += 10;--t[num - 1];number(t, num - 1);}return;}int main() {int beg;//顶端位int end;//个位int cyc;//循环次数int all;//循环次数同上int *num;//存储每一次循环算出的值的数组int numa;//四个临时变量int numb;int numc;int numd;char t[100];//应该不会丧心病狂到输入100位的数字,不行就调大scanf("%d", &cyc);//获得循环次数all = cyc;//备份num = (int*)malloc(sizeof(int) * cyc);//根据循环数,获得数组元素数while (cyc--) {//挑几次就循环几次end = beg = 0;//置0numa = 1;//每次的数列上限scanf("%s", t);//获取该次循环要找哪一位的数while (t[end] != '\0')++end;//寻找个位--end;//大数存储的最后一位有效数字,即个位while (1) {//直到找到了才通过goto END离开for (numb = 1; numb <= numa; ++numb) {//1~当前上限numanumd = 1;//默认位数1numc = numb;//存值while (numc /= 10)numd++;//得到当前位数while (numd) {//位数往后推,直到个位都推没了numc = numb;if (numd != 1)//避免分母为0,然后将numd位后面的全截掉for (int i = numd - 1; i > 0; --i)numc /= 10;numc %= 10;//通过,截掉numd位前面的位,最终得到当前位的值--t[end];//成功获得1位,所以-1if (t[end] < '0'&&beg < end) {//如果发现需要退位t[end] += 10;//补成9--t[end - 1];//前一位被降number(t, end - 1);//检查前一位是否也需要退位while (t[beg] < '1'&&beg < end)//顶位是否需要退位++beg;}if (beg == end && t[end] == '0') {//如果已到尾且归0num[cyc] = numc;//倒立输入所求位数goto END;}--numd;//当前位数往后移动}}++numa;//增加上限}END://该次循环结束;//这个分号是必要的}while (all--)printf("%d\n", num[all]);//输出free(num);num = NULL;return 0;}

蹭蹭df

其他回答(0)
0人关注该问题
+1

 加载中...