| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 237 人关注过本帖
标题:求一个通俗易懂的思路。想用c写。
只看楼主 收藏
苦芯糖
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-11-14
结帖率:100%
  已结贴   问题点数:20  回复次数:8   
求一个通俗易懂的思路。想用c写。
【1】我们要求找出具有下列性质数的个数(包含输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数最高位数字的一半; 3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止。


【输入】 一个数n

【输出】 满足条件的数的个数

【样例输入】 6

【样例输出】 6

【数据范围及提示】

6个数分别是:

6

16

26

126

36

136
【2】蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

【输入】 本题有多组数据,每组数据由一个正整数N组成。(N不大于100)

【输出】 对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。

【输入范例】 5

【输出范例】

1 3 6 10 15

2 5 9 14

4 8 13

7 12

11


2017-11-14 14:53
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:215
帖 子:5200
专家分:28689
注 册:2011-1-18
  得分:0 
f(0) = 1
f(n) = f(0) + f(1) + f(2) + …… + f(n/2)
2017-11-14 16:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:215
帖 子:5200
专家分:28689
注 册:2011-1-18
  得分:5 
程序代码:
#include <stdio.h>

int main( void )
{
    unsigned buf[1002];

    for( unsigned i=0, sum=1; 2*i<1001; sum+=buf[++i] )
    {
        buf[2*i+0] = sum;
        buf[2*i+1] = sum;
    }

    for( unsigned i=0; i<1001; ++i )
        printf( "f(%u) = %u\n", i, buf[i] );
}
2017-11-15 09:40
苦芯糖
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-11-14
  得分:0 
回复 3楼 rjsp
小白表示看不懂。还是感谢老哥的解答。
2017-11-15 14:41
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:111
专家分:165
注 册:2017-9-1
  得分:10 
/*【2】蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
*【输入】 本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
*【输出】 对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
*【输入范例】 5
*【输出范例】

*1 3 6 10 15
*2 5 9 14
*4 8 13
*7 12
*11

*/

程序代码:

# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>

int main(void)
{
    int column, row;
    int i, n, first, pace;
    printf("请输入一个整数:");
    scanf("%d", &n);
    for (i = 1, row = 1; row <= n; row++)
    {
        column = 1;
        first = i;                    //first用来保存i的值,因为下一行的第一个值的时候需要用到i;
        printf("%d ", i);            //输出每一行第一个数的值

        pace = row + 1;                //这是同一行上第一对相邻数的差,我称它为步距。这个量是会改变的。
        while (column <= n - row)    //用来输出每一行上的数。
        {
            i += pace;                //i加上步距等于下一个i的值。
            printf("%d ", i);
            pace++;                    //每一次循环步距都要自增1;
            column++;
        }
        printf("\n");
        i = row + first;            //下一行第一个数的值
    }

    return 0;
}

菜鸟一枚,求各位大神多多关照。
2017-11-15 14:58
Alien_Lee
Rank: 7Rank: 7Rank: 7
来 自:Linux帝国
等 级:黑侠
威 望:3
帖 子:129
专家分:583
注 册:2016-7-19
  得分:5 
第一题思路:
1.对n进行处理,等到一个最高位的数p,
2.求的p的二分之一的下确界整数q。
3.递归求解,n的值为n/2+小于n/2所有情况的和。
4.输出计数器的计数值。
程序代码:
int conts(int num)
{
    int i;
    int sum=0;
    if(num==1) return 1;
    if(num==2) return 2;
    for(i=num/2;i>0;i--)
    {
        sum+=(conts(i)-1);
    }
    return 1+sum+num/2;
}

int main()
{
    int num;
    int tp;
    int cont=1;
    int hex=1;
    scanf("%d",&num);
    for(tp=num/hex;!(tp<=9&&tp>0);hex=hex*10)
    {
        tp=num/hex;
    }
    cont=conts(tp);
    printf("cont=%d\n",cont);
    return 0;
}
第二种办法,其实最高位的情况总共9种,每一种都可以算出具体的答案,然后用switch语句直接给答案,相信这是最快的方法

  DEBUG的过程就是进步的过程,每一个小错误都是大问题!...
2017-11-15 20:00
苦芯糖
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-11-14
  得分:0 
回复 5楼 yu965634383
纯手打运行了一遍你的程序,没有错误,但结果不是题目要求的那样。
附件: 您没有浏览附件的权限,请 登录注册
7 天前 15:11
苦芯糖
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-11-14
  得分:0 
回复 6楼 Alien_Lee
程序本身没错,运行出来的结果有错,我在想你说的switch语句,如果能写出来会发你的。
7 天前 15:26
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:111
专家分:165
注 册:2017-9-1
  得分:0 
回复 7楼 苦芯糖
你代码都敲错了: i+pace;
应该是i+=pace;

[此贴子已经被作者于2017-11-16 16:50编辑过]


菜鸟一枚,求各位大神多多关照。
7 天前 16:46







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.223715 second(s), 8 queries.
Copyright©2004-2017, BCCN.NET, All Rights Reserved