算法
#include<stdio.h>#include<string.h>
#define MAX 1024
int main()
{
int i=0,j=0,k=0,y=0,c=1,sum=1;
char a;
fgets(a,MAX,stdin);
for(i=0;i<MAX;i++)
if(a=='\0')
break;
for(j=0;j<i;j++)
{
c=1;
for(y=j;y<i-1;y++)
{
if((a-a)&&a!=a) //这一行的判断条件,乱写的
c++;
sum=sum+c;
}
}
printf("%d",sum);
return 0;
}
//说说我的想法,我是这样的比如输入ababc,先这样比较,ab,aba,abab,ababc,然后从b开始ba,bab.......一直到最后,哪个c++就是出现不同字符的时候加一。大佬们看看,哪个判断条件该如何写 本帖最后由 jackz007 于 2020-12-12 12:32 编辑
#include <stdio.h>
int f(const char s[] , const int m)
{
int d = {0} , i , r ;
for(i = 0 ; i < m ; i ++) d - 'a'] ++ ;
for(r = 0 , i = 0 ; i < 26 ; i ++) if(d) r ++ ;
return r ;
}
int main(void)
{
char c , s ;
int i , j , m , sum ;
for(m = 0 ; (c = getchar()) && c >= 'a' && c <= 'z' ; s = c , s = '\0') ;
for(sum = i = 0 ; i < m ; i ++) for(j = i ; j < m ; j ++) sum += f(& s , j - i + 1) ;
printf("%d\n" , sum) ;
}
编译、运行实况
D:\00.Excise\C>cl x.c
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.28.29334 版
版权所有(C) Microsoft Corporation。保留所有权利。
x.c
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.All rights reserved.
/out:x.exe
x.obj
D:\00.Excise\C>x
ababc
28
D:\00.Excise\C> jackz007 发表于 2020-12-12 12:27
编译、运行实况
大佬给点注释,看不懂,还有ababc是正确的,28,但是我试了一下,我输入ab,不是应该是3吗,为什么答案是4 严凯 发表于 2020-12-12 14:30
大佬给点注释,看不懂,还有ababc是正确的,28,但是我试了一下,我输入ab,不是应该是3吗,为什么答案是 ...
int f(char s[] , int m)
s 自然是 字符串,m 为需要从字符串中统计的字符个数。
这个函数开辟了一个与 26 个小写字母相对应的整型数组 int d,用于统计每个字母出现的次数,在统计的时候,用 <字符编码> - 'a' 成为索引,这样从 'a' ~ 'z' 26 个字母对应于数值 0 ~ 25,例如,如果出现的字符是 'c' 那么,d['c' - 'a'] ++ ,就会使数组元素 d 的值增加 1。最后统计的时候,数组 d 中不为 0 值的元素个数就是我们所需要的 f 值。
ab 的值是 4 是正确的:
a 1
ab 2
b 1 jackz007 发表于 2020-12-12 14:52
s 自然是 字符串,m 为需要从字符串中统计的字符个数。
这个函数开辟了一个与 26...
抱歉,抱歉,才睡醒,人都是懵的,1+2+1等于3都算出来了{:10_280:} jackz007 发表于 2020-12-12 14:52
s 自然是 字符串,m 为需要从字符串中统计的字符个数。
这个函数开辟了一个与 26...
大佬,哪个d - 'a'] ++是上面意思,就是这个++,是值加一,还是加地址? 严凯 发表于 2020-12-12 15:49
大佬,哪个d ++是上面意思,就是这个++,是值加一,还是加地址?
是的,就是将对应于这个字符的数组元素的值加 1
页:
[1]