严凯 发表于 2020-12-12 11:33:32

算法

#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:27:35

本帖最后由 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>

严凯 发表于 2020-12-12 14:30:39

jackz007 发表于 2020-12-12 12:27
编译、运行实况

大佬给点注释,看不懂,还有ababc是正确的,28,但是我试了一下,我输入ab,不是应该是3吗,为什么答案是4

jackz007 发表于 2020-12-12 14:52:08

严凯 发表于 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

严凯 发表于 2020-12-12 15:29:44

jackz007 发表于 2020-12-12 14:52
s 自然是 字符串,m 为需要从字符串中统计的字符个数。
      这个函数开辟了一个与 26...

抱歉,抱歉,才睡醒,人都是懵的,1+2+1等于3都算出来了{:10_280:}

严凯 发表于 2020-12-12 15:49:00

jackz007 发表于 2020-12-12 14:52
s 自然是 字符串,m 为需要从字符串中统计的字符个数。
      这个函数开辟了一个与 26...

大佬,哪个d - 'a'] ++是上面意思,就是这个++,是值加一,还是加地址?

jackz007 发表于 2020-12-12 16:25:36

严凯 发表于 2020-12-12 15:49
大佬,哪个d ++是上面意思,就是这个++,是值加一,还是加地址?

    是的,就是将对应于这个字符的数组元素的值加 1
页: [1]
查看完整版本: 算法