1.现在需要将其转换为千分位格式,即从整数最低位开始,每三位数字插入一个英文逗号,以提高可读性。例如,对于123456789,转换后为 123,456,789。也就是说从后往前只要够三个字符就增加一个英文逗号,怎么才能从后往前数呢,这个是时候就需要逆序字符串,就可以得到从前往后面数三个数据 ,增加一个变量count用来计数,只要能被三整除就将这个位置后面的所有元素都像后面挪动,然后将这个位置增加英文逗号,然后让指针跳过这个英文逗号继续像后面找,直到找到‘\0’,增添完成以后再将字符串逆序一下,打印出来就可以了,最坏的时间复杂度应该是O(n^2),每次到三个都要进去循环,效率不高。只是用了几个常量级的临时变量,空间复杂度是常量级
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> void reverse(char* str)//逆序字符串 { assert(str);//断言一下因为后面会解引用,对空指针的解引用很危险 int len = strlen(str); char* left = str; char* right = str + len - 1; while (right>left)//两个指针分别向后面寻找 { char temp = *right; *right = *left; *left = temp; left++; right--; } } int main() { //输入一个字符串,然后将这个字符串逆序,逆序后从前向后遍历,找到三个就添加一个,其他是字符后移 char str[100] = { 0 }; scanf("%s", str); reverse(str);//先逆序 int count = 0; char* temp = str; while (*temp)//*为假说明已经到字符串末尾了 { if (count % 3 == 0&&count!=0) { int len = strlen(str);//每次进来都要重新计算因为添加进去的有英文逗号 char* rear = str+len;//再创建一个变量,字符从后面开始挪动 while (rear!=temp) { *rear = *(rear - 1);//减到temp,把temp空起来 rear--; } *temp = ',';//把英文逗号赋值过去 temp++;//跳过这个英文逗号 } count++;//计数 temp++;//当前字符的位置 } reverse(str); printf("%s",str); return 0; }