C 如何通过从每个数字的左端和/或右端删除一个或多个数字来生成所有不同的数字
我需要从文件中读取一些数字并生成所有数字,这些数字可以通过从开始处删除1个数字和从结束处删除1个数字(对于我读取的每个数字),然后将它们打印到新文件中。我知道如何在文件中读取和打印,所以我的问题更多的是关于解决此问题时的思考方式。 以下是此问题的一个示例: 对于3457,输出应为:C 如何通过从每个数字的左端和/或右端删除一个或多个数字来生成所有不同的数字,c,C,我需要从文件中读取一些数字并生成所有数字,这些数字可以通过从开始处删除1个数字和从结束处删除1个数字(对于我读取的每个数字),然后将它们打印到新文件中。我知道如何在文件中读取和打印,所以我的问题更多的是关于解决此问题时的思考方式。 以下是此问题的一个示例: 对于3457,输出应为: 457 345 34 45 57 3 4 5 7 我最初的想法是使用双指针将数字作为字符串数组读取(假设我知道应该读取多少个数字,以便可以动态分配内存),然后处理它们 在此之后,我想到了一种生成数字的方法,该数字是
457
345
34
45
57
3
4
5
7
我最初的想法是使用双指针将数字作为字符串数组读取(假设我知道应该读取多少个数字,以便可以动态分配内存),然后处理它们
在此之后,我想到了一种生成数字的方法,该数字是通过从开始处删除1个数字和从结束处删除1个数字(但不是同时)获得的,我使用了for循环:
for ( i = 1, j = (strlen(p[0]) - 2); i < strlen(p[0]) - 2, j >=0; ++i, --j ) //p[0] is my first number read from the file
{
printf("\n%s", p[0] + i); //this will print the numbers 457, 57, 7
char temp[10];
strncpy(temp, p[0], j);//I copy into a new temporary string to print the numbers 345, 34, 3
temp[j] = '\0';
printf("%s", temp);
printf("\n%s", temp + i);//this will print the numbers 45,4
}
for(i=1,j=(strlen(p[0])-2);i=0;++i,--j)//p[0]是从文件中读取的第一个数字
{
printf(“\n%s”,p[0]+i);//这将打印数字457、57、7
煤焦温度[10];
strncpy(temp,p[0],j);//我复制到一个新的临时字符串中以打印数字345,34,3
温度[j]='\0';
printf(“%s”,温度);
printf(“\n%s”,temp+i);//这将打印数字45,4
}
但是我不知道如何继续处理其余的数字,我就是找不到或想不出一种算法可以按这个顺序打印它们,所以如果您将数字转换成字符串(例如,使用
sprintf
),我真的很想得到一些关于如何解决这个问题的帮助你可以这样做:
- 获取原始字符串并从右侧移除0字符
- 从左侧移除0字符并打印
- 从左侧移除1字符并打印
- 从左侧移除2个字符并打印
- 从左侧移除字符串长度-1字符并打印
- 取原始字符串并从右侧移除1字符
- 从左侧移除0字符并打印
- 从左侧移除1字符并打印
- 从左侧移除2个字符并打印
- 从左侧移除字符串长度-1字符并打印
- 取出原始字符串并从右侧移除2个字符
- 从左侧移除0字符并打印
- 从左侧移除1字符并打印
- 从左侧移除2个字符并打印
- 从左侧移除字符串长度-1字符并打印
int main()
{
char str[] = "123456";
size_t len = strlen(str);
size_t i, j;
for (i = 0; i < len; i++) // i is number of chars to remove (aka not print) from right
{
for (j = 0; j < len-i; j++) // j is number of chars to remove (aka not print) from left
{
size_t z=j;
int p = 0;
while (z < (len - i))
{
printf("%c", str[z]);
z++;
p = 1;
}
if (p) printf("\n");
}
}
return 0;
}
现在,如果输入字符串为“1001”,则程序的输出为(手动添加注释):
如您所见,该算法可能存在问题,例如前导零和重复数字。如果那是无效的,你必须
以下假设数字作为字符串(以null结尾的字符数组)从输入文件中读取,并且这些字符串是以10为基数的整数的有效表示形式,不一定在
int
范围内,仅为数字
- 跳过前导零。我假设像
这样的字符串如果没有被拒绝,应该被解释为数字42,这样输出应该只有4和2,没有任何0。可以在这里使用“0042”
- 查找剩余字符串的长度(
),如果少于两个字符,则返回len
- 从1(包括)循环到
(排除)。这是要从源代码中删除的字符数,我们称之为len
i
- 子字符串的大小为
sub_length=len-i
- 如果子字符串的第一个字符是
,且其长度大于1,请跳过以下步骤,以便从'0'
开始,我们不会打印1007
或007
,只打印07
和0
7
- 检查是否可以在我们已经考虑过的源字符串的左侧部分找到实际的子字符串。例如,给定
,在打印4545
和45
后,我们将在54
中找到最后一个454
,并跳过它。在这里,包含函数如45
或strncmp
的循环可能很有用,而不仅仅是需要以null结尾的字符串作为参数memcmp
- 如果上一步未找到重复项,请打印子字符串(使用循环,或使用
和格式说明符printf
,如前所述)“%.*s”
循环从0到<>代码>(代码)>(包括两个),以考虑所有大小的子字符串<代码>子长度> <代码>。例如从<代码> 123 >代码>我们首先考虑代码> 12 < /代码>和<代码> 23 <代码> < /p> - 子字符串的大小为
迭代长度,从
0
到“以10为基数表示的数字长度”减1。然后,对于每个这样的长度,使用索引从0
迭代到“以10为基数表示的数字的长度”,减去第一个循环中的迭代器。然后在第二个循环中,只需从第二个循环的迭代器开始打印数字,数字的数量与迭代器的数量相同
1001 // ok
001 // Is this valid? Or should it be 1
01 // Is this valid? Or should it be 1
1 // ok
100 // ok
00 // Is this valid? Or should it be 0
0 // ok
10 // ok
0 // ok but repeated! Is this valid?
1 // ok but repeated! Is this valid?
Source: "3457"
345 457 34 45 57 3 4 5 7
Source: "1045"
104 10 45 1 0 4 5
Source: "5454"
545 454 54 45 5 4
Source: "10000"
1000 100 10 1 0
Source: "0042"
4 2