给出一个非常大的整数,我们想要将其每隔三位打上逗号并打印出来,请写一份代码实现该操作:
如972315451--->972,315,451;如1972315451--->1,972,315,451。
方法一
首先我们需要知道,如果位数不是3的整数倍,那么多的位数应该在左侧,可以理解为从右侧开始记位数打上逗号,同时,一个整数作为整型类型或者长整型,它只是一个数,如果想要与逗号一起放入一个数组中,那便只能放入字符数组,同时我们需要将数转换为字符的数字。
如何转换呢? '1' - '0' = 1;
那么我们只需要将原数字+'0'(字符数字0)就能够得到我们想要的字符数字。
因此,思路就是--->我们拿出整数每一位,转换为字符数字,将其放入一个字符数组,每隔三位向字符数组中加入逗号字符,最后我们打印这个数组即可:
long long N = 0;
scanf("%lld", &N);
char arr[20] = { 0 };
int i = 0;//字符数组下标
int k = 0;//用于添加逗号
在每一位的拿出过程中,我们用到取模和除号,整数N%10能够得到我们想要的个位的数字,每次模10后我们除10,从而去除已经拿出来的个位:
while (N)
{
if (k % 3 == 0 && k != 0)
{
arr[i] = ',';
i++;
}
arr[i] = N % 10 + '0';
i++;
k++;
N /= 10;
}
定义 i 用来控制字符数组的下标,定义 k 来控制位数,每次我们经过一次循环,k+1,那么通过判断k%3是否为0来为字符数组打上逗号。
那么通过这样的一个循环,我们能够把N这个数的每一位,从个位开始逐个存入字符数组arr中,同时每存入3位,会为arr数组中存入一次逗号。
由于是从个位开始的存入,所以最后的打印,我们需要从该数组的末尾开始打印:
for (i--; i >= 0; i--)
{
printf("%c", arr[i]);
}
我们直接使用前面定义的变量 i,前面while循环中,在arr中最后放入了N的首位后,我们发现,i还是在自增1,因此此时的 arr+i 指向了这个数组末尾后一位,因此在for循环开始时,需要将 i 自减1,然后从后向前打印。
整体代码如下:
int main()
{
long long N = 0;
scanf("%lld", &N);
char arr[20] = { 0 };
int i = 0;
int k = 0;//用于添加逗号
while (N)
{
if (k % 3 == 0 && k != 0)
{
arr[i] = ',';
i++;
}
arr[i] = N % 10 + '0';
i++;
k++;
N /= 10;
}
for (i--; i >= 0; i--)
{
printf("%c", arr[i]);
}
return 0;
}
方法二
那在此再给出一种方法:
如果我们没有想到通过 +'0' 数字转换字符的方法,我们可以通过sprintf函数,将格式化数据转换为字符串存入一个字符数组中,再通过该字符数组进行操作:
long long n = 0;
scanf("%lld", &n);
char ca[20] = { 0 };
sprintf(ca, "%lld", n);
我们发现,这个加逗号的操作,同样还是从末尾开始算位数进行添加比较方便,那么我们还可以通过字符串逆序--->添加逗号--->逆序回来来完成这个操作。
那么我们首先就得写一个逆序字符串的函数:定义并使用字符指针left与right进行while循环逆序即可:
void Reverse(char* pc)//字符串逆序函数
{
size_t len = strlen(pc);
char* left = pc;
char* right = pc+len-1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
我们写出整体框架:字符串逆序--->添加逗号--->逆序回来
int main()
{
long long n = 0;
scanf("%lld", &n);
char ca[20] = { 0 };
sprintf(ca, "%lld", n);
Reverse(ca); //逆序
Add_Number(ca);//添加逗号
Reverse(ca);//逆序
printf("%s\n", ca);
return 0;
}
那么就还剩下一个添加逗号的函数需要我们写出来:
我们首先得明白,我们传入了这个数字的字符串,但是,我们需要在这个字符串中添加逗号,那么就意味着,我们不能传入这个字符数组的长度(会根据添加逗号的数量而变长),而是应该在函数内部进行求解。
我们同样使用一个while循环,条件给上指针解引用,那么遇到 '\0' 便会停止,即走完字符串停止。
由于我们需要使用传入指针参数进行逗号的赋值,那么我们还需要创建一个字符指针变量让他指向首字符地址进行遍历,同时给上变量j与变量x,j来控制位数赋值逗号,x代表着输入了几个逗号,每次输入逗号,会导致字符数组变长,第一次在pc[3]的位置添加逗号,第二次在pc[6]吗?并不是!因为我们添加了一个逗号之后,逗号占了一个下标,因此下一个逗号应该在pc[7]的位置!这个x就代表着我们真正需要在哪个位置上添加逗号!添加位置应该是pc[j+x]!
同时j为3的倍数时,代表需要添加逗号了,那么添加之前,我们需要把数组后面的元素全部后移一位:
if (j % 3 == 0)
{
size_t len = strlen(pc);
for (size_t q = len-1; q>=j+x; q--)
{
pc[q + 1] = pc[q];
}
}
那么添加逗号的代码如下:
char* ch = pc;
size_t j = 1;
size_t x = 0;
while (*ch != '\0')
{
if (j % 3 == 0)
{
size_t len = strlen(pc);
for (size_t q = len-1; q>=j+x; q--)
{
pc[q + 1] = pc[q];
}
if(*(ch+1)!='\0')
{
pc[j + x] = ',';
}
ch += 2;//跳过逗号
j++;
x++;
}
else
{
ch++;
j++;
}
}