Math Pro 數學補給站's Archiver

機會總是留給有準備的人。

ksjeng 發表於 2010-2-14 22:03

要如何修改與套用程式碼-任意連續N個整數乘積是N的倍數

老師好:
我想要證明任意連續N個整數乘積都會是N的倍數
我發現有一個現成的程式可以套用([url=http://www2.lssh.tp.edu.tw/~jing/teach/c-ex/wh9.txt]http://www2.lssh.tp.edu.tw/~jing/teach/c-ex/wh9.txt[/url])
如輸入21 22 23 24 25必定是5的倍數
程式碼:
// while 一組數字的乘積
#include <iostream.h>
#include <stdlib.h>
main()
{
   int a,t=1;
   cout<<"此程式能計算一組整數數字的乘積。\n";
   cout<<"請輸入一個數字(輸入0為結束):";
   cin>>a;
   if (a!=0)              //若輸入值為0則結束程式
   {
     while(a!=0)          //當a不為0則while迴圈計算輸入值之乘積
     {
       t=t*a;             //將輸入之a值相乘
       cin>>a;
     }
     cout<<"計算結果為"<<t<<"\n";
   }
   system("PAUSE");
}

請問這個程式碼要如何修改成我實際需要的
但我又覺得N!是連續N個數相乘積的特例
似乎底下程式就可以套用
[url=http://www2.lssh.tp.edu.tw/~jing/teach/c-ex/func-1.txt]http://www2.lssh.tp.edu.tw/~jing/teach/c-ex/func-1.txt[/url]
我該如何切入啊
程式碼:
/* func-1 利用遞迴函數求N! */
#include <stdio.h>
#include <stdlib.h>
main()                               /* 主程式 */
{
  int n;
  long fact();                       /* 宣告fact()函數為長整數值 */
  printf("n!=n*(n-1)!請輸入n值:");
  scanf("%d",&n);
  printf("%d!=%ld\n",n,fact(n));
  system("PAUSE");
  return 0;
}
                                     /* 開始fact()函數 */
long fact(int n)
{
  if (n==0)                          /* 當n為0即0!=1則傳回1 */
     return(1);
  else
     return(n*fact(n-1));            /* 呼叫遞迴函數func(n-1) */
}

[[i] 本帖最後由 ksjeng 於 2010-2-14 10:35 PM 編輯 [/i]]

weiye 發表於 2010-2-15 00:08

[code]#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    unsigned int n,a;
    unsigned long product=1,quotient, remainder;

    cout<<"請問您要計算連續多少個數字的乘積呢? ";
    cin>>n;
    cout<<endl;
   
    cout<<"請問第一個數字是多少呢? ";
    cin>>a;
    cout<<endl;
   
   
    for(unsigned int i=0;i<n;i++)
         product*=(a+i);
   
    quotient  = product/n;
    remainder = product%n;
   
   
    for(unsigned int i=0;i<n;i++)
         cout<<(a+i)<<(i==(n-1)?"":"*");
    cout<<" = "<<product<<" = "<<n<<" * "<<quotient<<" + "<<remainder<<endl<<endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}
[/code]請不要輸入太大的數字,不然會超過 unsigned long 的上限。

ksjeng 發表於 2010-2-15 10:55

老師早
謝謝您
自從上次你給的迴圈提示之後
我發現語言程式真的可以幫助數學猜想的驗證喔
且網路上有好多偉人們寫好的程式
老師的程式設計功力深厚 著實讓人佩服
新年快樂

ksjeng 發表於 2010-2-15 12:12

無號整數所佔記憶體空間即可表示的範圍如下(旗標,洪維恩,C語言教學手冊第四版,P3-5)
關於無號長整數(unsigned long) 它的位元組是4 表示範圍是0到4294967295
這句話的說明是指我的電腦記憶體可處理的容量嗎
若記憶體越大,它就可以處理越大的數字處理嗎?
位元組是4表示相當於兩個國字嗎?

weiye 發表於 2010-2-16 01:13

[quote]原帖由 [i]ksjeng[/i] 於 2010-2-15 12:12 PM 發表 [url=https://math.pro/db/redirect.php?goto=findpost&pid=1867&ptid=906][img]https://math.pro/db/images/common/back.gif[/img][/url]
無號整數所佔記憶體空間即可表示的範圍如下(旗標,洪維恩,C語言教學手冊第四版,P3-5)
關於無號長整數(unsigned long) 它的位元組是4 表示範圍是0到4294967295
這句話的說明是指我的電腦記憶體可處理的容量嗎
若記憶體 ... [/quote]

"0到4294967295" 是指該變數可儲存的數值的大小,

並非你的電腦可處理的記憶體大小。

"它的位元組是4" 是指該變數實際佔用的記憶體大小。

ksjeng 發表於 2010-2-17 10:11

謝謝老師詳細的解惑
新年快樂

ksjeng 發表於 2010-2-22 01:16

懇請老師撥冗協助測試與指正程式碼錯誤的地方

[size=3][font=Times New Roman]/* func-1 [/font][font=新細明體]利用遞迴函數求[/font][font=Times New Roman]N! */[/font][/size]
[font=Times New Roman][size=3]#include <stdio.h>[/size][/font]
[font=Times New Roman][size=3]#include <stdlib.h>[/size][/font]
[size=3][font=Times New Roman]main()
/* [/font][font=新細明體]主程式[/font][font=Times New Roman] */[/font][/size]
[font=Times New Roman][size=3]{[/size][/font]
[font=Times New Roman][size=3]
int n;[/size][/font]
[size=3][font=Times New Roman]
long fact();
/* [/font][font=新細明體]宣告[/font][font=Times New Roman]fact()[/font][font=新細明體]函數為長整數值[/font][font=Times New Roman] */[/font][/size]
[size=3][font=Times New Roman]
printf("n!=n*(n-1)![/font][font=新細明體]請輸入[/font][font=Times New Roman]n[/font][font=新細明體]值[/font][font=Times New Roman]:");[/font][/size]
[font=Times New Roman][size=3]
scanf("%d",&n);[/size][/font]
[font=Times New Roman][size=3]
printf("%d!=%ld\n",n,fact(n));[/size][/font]
[font=Times New Roman][size=3]
system("PAUSE");[/size][/font]
[font=Times New Roman][size=3]
return 0;[/size][/font]
[font=Times New Roman][size=3]}[/size][/font]
[size=3][font=Times New Roman]
/* [/font][font=新細明體]開始[/font][font=Times New Roman]fact()[/font][font=新細明體]函數[/font][font=Times New Roman] */[/font][/size]
[font=Times New Roman][size=3]long fact(int n)[/size][/font]
[font=Times New Roman][size=3]{[/size][/font]
[size=3][font=Times New Roman]
if (n==0)
/* [/font][font=新細明體]當[/font][font=Times New Roman]n[/font][font=新細明體]為[/font][font=Times New Roman]0[/font][font=新細明體]即[/font][font=Times New Roman]0!=1[/font][font=新細明體]則傳回[/font][font=Times New Roman]1 */[/font][/size]
[font=Times New Roman][size=3]
return(1);[/size][/font]
[font=Times New Roman][size=3]
else[/size][/font]
[size=3][font=Times New Roman]
return(n*fact(n-1));
/* [/font][font=新細明體]呼叫遞迴函數[/font][font=Times New Roman]func(n-1) */[/font][/size]
[font=Times New Roman][size=3]}[/size][/font]
[font=Times New Roman][size=3][/size][/font]
[font=Times New Roman][size=3]執行結果如下:[/size][/font]
[font=Times New Roman][size=3][/size][/font]
[img]http://farm3.static.flickr.com/2765/4376464908_c8fe401ac9_o.jpg[/img]

weiye 發表於 2010-2-22 19:21

在宣告 fact 函式的傳入值型別漏掉了,main 的傳入、傳回值型別也漏掉了。
[code]/* func-1 利用遞迴函數求N! */
#include <stdio.h>
#include <stdlib.h>


int main(void)  /* 主程式 */
{

    int n;

    long fact(int n);

    printf("n!=n*(n-1)!請輸入n值:");
    scanf("%d",&n);

    printf("%d!=%ld\n",n,fact(n));

    system("PAUSE");
    return 0;
}




/* 定義fact()函數 */
long fact(int n)
{
    if (n==0)   /* 當n為0即0!=1則傳回1 */
       return(1);
    else
        return(n*fact(n-1));  /* 呼叫遞迴函數func(n-1) */
};[/code]

或是,也可以把函式的宣告放在最前面,看起來會比較整齊。
[code]
/* func-1 利用遞迴函數求N! */
#include <stdio.h>
#include <stdlib.h>

long fact(int);    /* 宣告fact()函數為長整數值 */

int main(void)  /* 主程式 */
{

    int n;


    printf("n!=n*(n-1)!請輸入n值:");
    scanf("%d",&n);

    printf("%d!=%ld\n",n,fact(n));

    system("PAUSE");
    return 0;
}

/* 定義fact()函數 */
long fact(int n)
{
    if (n==0)   /* 當n為0即0!=1則傳回1 */
       return(1);
    else
        return(n*fact(n-1));  /* 呼叫遞迴函數func(n-1) */
}
[/code]

或是,把函式的定義往前放,不用寫宣告。
[code]
/* func-1 利用遞迴函數求N! */
#include <stdio.h>
#include <stdlib.h>


/* 定義fact()函數 */
long fact(int n)
{
    if (n==0)   /* 當n為0即0!=1則傳回1 */
       return(1);
    else
        return(n*fact(n-1));  /* 呼叫遞迴函數func(n-1) */
}


int main(void)  /* 主程式 */
{

    int n;


    printf("n!=n*(n-1)!請輸入n值:");
    scanf("%d",&n);

    printf("%d!=%ld\n",n,fact(n));

    system("PAUSE");
    return 0;
}
[/code]
或是,把函式的定義放在另一個函式的內部,也不用寫宣告。
[code]
/* func-1 利用遞迴函數求N! */
#include <stdio.h>
#include <stdlib.h>


int main(void)  /* 主程式 */
{

    int n;

    /* 定義fact()函數 */
    long fact(int n)
    {
        if (n==0)   /* 當n為0即0!=1則傳回1 */
           return(1);
        else
            return(n*fact(n-1));  /* 呼叫遞迴函數func(n-1) */
    }

    printf("n!=n*(n-1)!請輸入n值:");
    scanf("%d",&n);

    printf("%d!=%ld\n",n,fact(n));

    system("PAUSE");
    return 0;
}
[/code]

ksjeng 發表於 2010-2-23 00:20

老師晚安
我利用您寫的第三個程式測試成功了
謝謝您願意指導我這個程式語言的生手
平安

頁: [1]

論壇程式使用 Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.