nが与えられたとき、その正の約数をすべて求めるプログラムを書け。 
 これは擬似言語でも、Basicでもいいそうです。
 初心者なのでわかりません。宜しくお願いします。

A 回答 (4件)

C言語で、単純に



void main( int ac, char* av[] )
{
int i,m,n;
if( ac != 2 ) return;
m = atoi( av[1] ); /* 数字を取得 */
if( m < 0 ) n = -1 * m; /* 負の場合 */
else n = m; /* 正の場合 */
for( i=1; i<n; i++ ){
if( n % i == 0 ){ /* 余りが0の場合iはnの約数 */
printf("%d\n", i);
}
}
}

これで、正の約数はすべて得られるが、nが十分大きい場合結果が出るまでに時間がかかり、負荷が高いのでちょっと問題です。
多分、間違いなくもっと良い回答例があるとは思いますが、一例ということでこれでどうでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました。助かります。

お礼日時:2001/10/20 20:42

以下に処理の流れとプログラムを記します。

プログラムと照らし合わせて読んでください。

約数とは、「因数を掛け合わせたもの」ですよね?
だからまず因数を求める関数を作成しました。(関数:subFactorization)
そのとき注意すべきは
10の因数を求めるのには5まで、7の因数を求めるには4までに因数がないときはそれ以上の値に因数は存在しないという点です。なので途中でそのリミットになったら抜ける条件を追加しました。(変数:lngRimitがそれにあたります。)



次にその因数を掛け合わすために、その因数を順順に取り出す関数を作成しました。(関数:subMultiplyMatrix)
実際に例をあげると最初に210を因数分解した場合
3,5,7という値が得られます。これらを掛け合わせるとき



3×5
3×7
5×7
3×5×7
という7パターンがあります。
この7パターンの値を配列に収めるようなループが必要でした。(プログラム中のi,jを使用してループしてるのがその部分です)
次にその配列内の値を乗算する関数を作成しました。(関数:subMultiplyMatrix)
しかし、これだけではだめでした。
210だから因数は[3,5,7]だけど、12のときは[2,2,3]という値を得ます。この条件でできるパターンは



2×2
2×3
2×2
2×2×3
となり、重複する値が返ってきます。これではこまります。
なので答えを収める変数をコレクションで宣言し、値のセットをするときに"KEY"という文字列と値を組み合わせたKEYを同時にセットし、重複した値を記憶しないようにしました。(KEY
& wkLng となってる部分です。)
ちなみにOn Error Resume Next
というのが書いてありますが、これがないと、「重複したキーが存在する」というエラーが生じます。

あとは単なるメッセージボックスに出力をしてるだけです。環境を特に書いてなかったので、Join関数を使用してます。VB6限定ですが、大丈夫かな?



以上が処理の流れです。


いやーホント勉強になりました。



以下のソースを貼り付けて見てください。
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
  Destination As Any, _
  Source As Any, _
  ByVal Length As Long _
)


Private lngAry()  As Long '因数記憶用の配列
Private lngCnt   As Long '因数のカウンタ

Sub Main()
  Dim lngDef     As Long '初期値
  Dim ansCollection  As Collection  '答えの入るコレクション
  
  Dim i    As Long
  
  '初期値を得る
  On Error GoTo PGMERR
  lngDef = InputBox("", "初期値を入力してください")
  On Error GoTo 0
  
  '初期値が1未満をエラーとします
  If lngDef < 1 Then GoTo PGMERR
  
  '因数カウンタの初期化
  lngCnt = 0
  '因数記憶用の配列を初期化
  Erase lngAry
  
  
  '因数分解をする
  Call subFactorization(lngDef)
  
  
  'コレクションを初期化
  Set ansCollection = New Collection
  'とりあえず1を追加
  ansCollection.Add 1, "KEY1"
  '配列の中身を順に掛け合わせ、コレクションに追加する
  Call subMultiplyMatrix(lngAry, ansCollection)
  
  
  '答えの出力
  Call ansOut(ansCollection)
  
PGMEND:
  Exit Sub
PGMERR:
  Call MsgBox("初期値に不正な値が入力されました")
End Sub


'因数分解
Sub subFactorization(inLng As Long)
  Dim i      As Long
  Dim lngRimit  As Long
  
  '中間の値を求める(切り上げ)
  lngRimit = Int((inLng / 2 * 10 + 9) / 10)
  
  For i = 2 To inLng
    '割ってあまり0のとき、因数とする
    If (inLng Mod i) = 0 Then
      '因数を記憶
      ReDim Preserve lngAry(lngCnt) As Long
      lngAry(lngCnt) = i
      '因数のカウンタを増やす
      lngCnt = lngCnt + 1
      '因数で割った値でさらに因数分解
      Call subFactorization((inLng / i))
      Exit For
    End If
    
    '中間の値になっても因数が見つからないとき、引数自身が因数とする
    If i >= lngRimit Then
      '因数を記憶
      ReDim Preserve lngAry(lngCnt) As Long
      lngAry(lngCnt) = inLng
      '因数のカウンタを増やす
      lngCnt = lngCnt + 1
      Exit For
    End If
  Next i
End Sub


'掛け算マトリックス
Sub subMultiplyMatrix(inlngAry() As Long, inColection As Collection)
  Dim wklngAry() As Long
  
  Dim i    As Long
  Dim j    As Long
  Dim wkLng  As Long
  
  '因数に同じ値が存在するときに発生するエラーを無視させる
  On Error Resume Next
  For i = 0 To lngCnt - 1
    For j = 0 To (lngCnt - 1) - i
      Call copyAry(wklngAry, inlngAry(j), i + 1)
      wkLng = subMultiply(wklngAry)
      inColection.Add wkLng, "KEY" & wkLng
    Next j
  Next i
  On Error GoTo 0

End Sub


'配列の中身を掛け算して値を返す関数
Function subMultiply(inlngAry() As Long)
  Dim i    As Long
  
  subMultiply = inlngAry(0)

  For i = LBound(inlngAry) + 1 To UBound(inlngAry)
    subMultiply = subMultiply * inlngAry(i)
  Next i

End Function


'配列の中身をエリアの分だけコピーする関数
Sub copyAry(inDest() As Long, inSrc As Long, inArea As Long)
  ReDim inDest(inArea - 1) As Long
  Call CopyMemory(inDest(0), ByVal VarPtr(inSrc), ByVal LenB(inSrc) *
inArea)
End Sub


'答えの出力
Sub ansOut(inCollection As Collection)
  Dim wkStr    As String
  Dim ansCount  As Long
  Dim wkStrAry() As String
  Dim i      As Long
  
  ansCount = inCollection.Count
  
  ReDim wkStrAry(ansCount - 1) As String
  
  For i = 1 To ansCount
    wkStrAry(i - 1) = inCollection.Item(i)
  Next i
  
  wkStr = "答えは[" & Join(wkStrAry, ",") & "]です"
  MsgBox wkStr
End Sub
    • good
    • 0

回答がでてるんで、よろしいかと思いますが、


ループは与えられた数のルートをとったものまでで
よいはずです。
そのためには、あまりが0となったときの商も
約数とすればよいかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。参考にいたします。

お礼日時:2001/10/20 20:39

最近ツッコミ専門になりかけている...。


yusuke5111さんのやり方が最も簡単ですね。
ただし、n自体もnの約数なので
for( i=1; i<=n; i++ ){
とすべきですね。
    • good
    • 0
この回答へのお礼

勉強になります。ありがとうございます。

お礼日時:2001/10/20 20:43

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語で、「自然数nを入力し、nの約数をすべて求めて出力後、その個数と

C言語で、「自然数nを入力し、nの約数をすべて求めて出力後、その個数と合計を出力をする。尚、nとして0(ゼロ)以下が入力されるまで、何度も繰り返す」という問題をやっています。
出力例は、(3を入力したとして)
「3の約数は 1  3
約数の個数は2個
約数の和は4」というものです。

そこで、コーディングをしたのですが、先生が開発したコンパイラで運用したところ、フリーズが起きて強制終了してしまいました。先生は、「そんなことはない。フリーズが起きるときはそのプログラムにバグがあるときだ」と言ってました。

そこでコーディングしたプログラムは以下の通りです。

#include <stdio.h>
main()
{int i,j,n,cnt,sum;
printf("自然数=");scanf("%d",&n);
while(n>=0){
printf("%dの約数は",n);
for(i=1;i<=n;i++){
if(n/i>=0){
j=n/i;
printf(" %d",j);
sum=sum+j;
cnt++;
j=0;}
}
printf("\n");
printf("約数の個数は%d個",cnt);
printf("約数の和は%d",sum);
}}

どこかに間違いがありますか?
IF文の中でいちいちめんどくさいことをしていますが、気にしないでください。

C言語で、「自然数nを入力し、nの約数をすべて求めて出力後、その個数と合計を出力をする。尚、nとして0(ゼロ)以下が入力されるまで、何度も繰り返す」という問題をやっています。
出力例は、(3を入力したとして)
「3の約数は 1  3
約数の個数は2個
約数の和は4」というものです。

そこで、コーディングをしたのですが、先生が開発したコンパイラで運用したところ、フリーズが起きて強制終了してしまいました。先生は、「そんなことはない。フリーズが起きるときはそのプログラムにバグがあるときだ」...続きを読む

Aベストアンサー

少なくともif(n/i>=0)のところはif(n%i==0)の間違いでないかと思います.
しかしそう考えるとjに関する処理は不要なはず.
jに関する処理は約数を逆順にしているだけということになり,質問の
意味と矛盾しますね.
あとj=0;は無駄な処理のように見えます.

QVisual Basic 2005 をインストールしましたが言語などが分からない

Microsoft Visual Basic 2005 Express Editionをインストールしました。低速回線なので困難でした。

このソフトでプログラミングをやろうと思っても使い方とか、言語とかがまるっきりわかりません。
今のところボタンの配置などだけです。メッセージボックスさえ出すことができません。

そこで、Microsoft Visual Basic 2005 Express Editionの使い方やVisual Basicの言語を初心者向けに紹介しているサイトがありましたら教えてください。

書籍をお勧めいただいたこともあるのですが、予算がないので、その辺をなんとかよろしくお願いします。

Aベストアンサー

http://homepage1.nifty.com/rucio/main/main.htm
私は↑ここ結構好きです。(^^)
あとは、リンク集で。↓
http://www2.ocn.ne.jp/~links4pg/link.htm
左側の下のほうのある、プログラムカテゴリのVB/VBAからたくさんリンクされてます。
参考になれば。

Q高校数学I、約数の個数についてです

お世話になります
M=2^a×3^b
N=2^c×3^d
Mの約数の個数が80、Nの約数の個数が72
M、Nの約数の個数が45です
a>=c
の条件の中で
a , b , c , d をもとんめる問題です
よろしくお願いします

Aベストアンサー

Mの約数は
2^x×3^y (x,yは整数で0≦x≦a,0≦y≦b)
とあらわせます。
xは0,1,...,aのa+1通り、yは0,1,...,bのb+1通りありますのでその組み合わせは
(a+1)(b+1)通り
あります。

同様にNの約数の個数は
(c+1)(d+1)通り
あります。

M.Nの両方の約数(公約数)は全てM.Nの最大公約数の約数になります。
二つの数x,yのうち、大きくないほうの数をmin(x,y)とするとN,Mの最大公約数は
2~min(a,c)×3^min(b,d)
となります。a≧cであることからmin(a,c)=c、上記と同様に最大公約数の約数の個数は
(c+1)(min(b,d)+1)通り
となります。

題意より
(a+1)(b+1)=80
(c+1)(d+1)=72
(c+1)(min(b,d)+1)=45
となります。
c+1は72と45の公約数ですので考えられる数としては
1,3,9
しかありえません。
また、min(b,d)=dとすると2番目の式と3番目の式で矛盾が生じますのでmin(b,d)=b
よって
(c+1)(b+1)=45
となります。
上と同様な議論でb+1は
1.5
しかありえません。

c+1=1or3or9,b+1=1or5
となりますが、このうち掛け合わせて45になるものは一組だけです。

以下略。

Mの約数は
2^x×3^y (x,yは整数で0≦x≦a,0≦y≦b)
とあらわせます。
xは0,1,...,aのa+1通り、yは0,1,...,bのb+1通りありますのでその組み合わせは
(a+1)(b+1)通り
あります。

同様にNの約数の個数は
(c+1)(d+1)通り
あります。

M.Nの両方の約数(公約数)は全てM.Nの最大公約数の約数になります。
二つの数x,yのうち、大きくないほうの数をmin(x,y)とするとN,Mの最大公約数は
2~min(a,c)×3^min(b,d)
となります。a≧cであることからmin(a,c)=c、上記と同様に最大公約数の約数の個数は
(c+1)(min(b,d)+1)通り
となりま...続きを読む

QVisual Basic 6.0のセットアッププログラムのインストールについて

Visual Basic 6.0を使用して簡単なプログラムを作成しています。
ディストリビューションウィザードを使用して、
プログラムのセットアッププログラムを作りました。
試しに、自分のPCでプログラムをインストールできるかどうかテストしてみました。
しかし、

Error
Path of File Not Found

セットアップメッセージ
セットアップするファイルが見つかりません。

というエラーが出てしまいました。
ファイルは存在しているのですが、インストール時のパス名が
Package\\@目的ファイル
となってしまい、ファイルを認識してくれません。
パス名を正しくするにはどのようにしたら良いのでしょうか?
どなたか、ご存知の方がいましたら教えて下さいますようよろしくお願い申し上げます。

Aベストアンサー

NT系OS(XPも含む)で、
VB6のインストーラーパッケージを実行した時、
ログインしているユーザー名が全角文字の場合に起こります。
http://support.microsoft.com/default.aspx?scid=/isapi/gomscom.asp?target=/japan/support/kb/articles/jp416/5/85.asp&LN=JA

手軽な方法としては、半角文字でのユーザ名でログインしてインストールし、
元のユーザ名で再起動後、ショートカットなどを手動で作成するのが手っ取り早いでしょう。

老婆心ながら、
VBの開発環境があるマシンに、
ディストリビューションウィザードで作成した
プログラムをセットアップしない方が無難です。

参考URL:http://support.microsoft.com/default.aspx?scid=/isapi/gomscom.asp?target=/japan/support/kb/articles/jp416/5/85.asp&LN=JA

Q約数の個数

私が今使っている参考書の数Aのテーマの一つで「約数の個数」というものがあり、解説として

 自然数Nの素因数分解が
  N=p^a*q^b*r^c(←pのa乗×qのb乗×rのc乗)
であれば、Nの正の約数の個数は
   (a+1)(b+1)(c+1)個である

この公式の補足説明の中に、
 ここでは、正の約数の個数だから上の数となったが、「Nの約数となる整数」というときには、負の約数も考える必要があるから、さらに上の数の2倍で、2(a+1)(b+1)(c+1)である

という解説がでていました。
 負の約数 という概念がわかりません。どういうもなのでしょうか。よろしくお願いします。

なお、この参考書は、受験用の公式集です。

Aベストアンサー

約数といった場合にはその文脈で
判断しなければいけないことがままあります.

>中学の参考書で調べてみると
> 約数とは、「ある整数aを割り切れることができる数bをaの約数という。」

これは正しいのですよ.別に「正の数」「自然数」だけに
限定してません.「整数」って書いてますよね.
この定義なら,例えば整数 10 の約数として,-2 は許容されます.
ただし「割り切れることができる数bを」というのが曖昧なので
そこは「割り切れることができる整数bを」とすべきでしょう.

>約数の個数は(a+1)(b+1)(c+1)個であるという表示になっており

これは曖昧でまずいです.「約数の個数」ではなく,
「正の約数の個数」なんです.
ただし,中学校の最初の段階でそこまでいうのは酷なのと
学習順序の問題で・・・正の数・負の数の前に
約数・倍数があることがあります.
この場合,そもそも負の数への言及がその時点でできないのです.
#丁寧な本ではきちんと注釈があるものです.
#あなたが見ている「公式集」でも「補足」されてますよね

約数・倍数に負の数も入れるかどうかですが・・・
例えば,
(x-5)(y-6)=3を満たす自然数x,yをすべて求めよ
とかいわれたらどうしますか?
x-5,y-6は3の約数なので
(x-5,y-6)=(1,3),(-1,-3),(3,1),(-3,-1)
これを整理して
(x,y)=(6,9),(4,3),(8,7),(2,5)
となるので3の約数として負のものを考えないといけないわけです.

つまり・・・文脈を考慮する必要があります.

きちんと作成された問題であるならば,
このような誤解がないようにきちんと工夫されています.
単純に「約数の個数を求めよ」ではなく,
何らかの形で「自然数」だけに議論が限定されていたりします.
そういうのを読み取るのも出題者が要求している事項です.

数学としては負の約数の排除なんかはしてません.
条件によって考えないケースがあるだけです.
約数の個数については式が汚くなるので
自然数だけの限定してしまうことが多いんです.
「約数の総和」だと負の数をいれると意味がなくなる(常に0)ので
負の数は入れませんね.


ちなみに・・・
>数学としては、(1)としてあるようで、NET検索しても、(2)は出てこないように、思います。

ネットで検索できるか否はともかく,そんなことはないです.
素因数分解,一般には
素元分解とか素因子分解とかいいますが,
これの一意性には留保条件「単元を除いて」があります.
単元というのは
「考えている範囲で逆数の存在するもの」ということで
整数で考える場合は,
1(逆数1),-1(逆数-1)が単元になります.
この単元が掛かっているか否かは最初から同じものとみなして
議論しているだけなのです.
なお,細かい議論をするときにはきちんと,例えば
X=uabcdと分解する.ただしuは単元とする
というように記述しますよ.

約数といった場合にはその文脈で
判断しなければいけないことがままあります.

>中学の参考書で調べてみると
> 約数とは、「ある整数aを割り切れることができる数bをaの約数という。」

これは正しいのですよ.別に「正の数」「自然数」だけに
限定してません.「整数」って書いてますよね.
この定義なら,例えば整数 10 の約数として,-2 は許容されます.
ただし「割り切れることができる数bを」というのが曖昧なので
そこは「割り切れることができる整数bを」とすべきでしょう.

>約数の...続きを読む

QMS-DOSで作ったBASICプログラムについて

MS-DOSで作った、という古いプログラムを見ないといけなくなったのですが、これってWindows上から見るにはF-Basicっていうソフトじゃないと見れないんでしょうか?

フリーソフトで見れるようなのがあれば教えてください
よろしくお願いします

Aベストアンサー

>MS-DOS時代のBASICで作ったプログラム=N88

N88ーBASICは、MS-DOS時代と言うよりは、NECのPC-98のMS-DOSで動作していたNEC制のBASICプログログラムです。

そのほかにも、BASICプログラムはあったはずですが、一番利用されていたものがN88だったと思います。

他のBASICプログラムでも、ASCIIセーブされた物なら読み込み可能ですし、多少の知識があれば修正して利用する事もできます。
(DISK-BASIC時代に、N-BASIC→F-BASIC 変換も少しやりました。)

昔のF-BASICは富士通のものだったので、N-BASICとは互換性がない物でした。
現在のF-BASICは、他種類のBASIC言語を変換する機能があるようですが、N88のプログラムをF-BASICの文法にする必要があるので、N88の文法で書かれたプログラムでは無くて、F-BASICのプログラムになってしまいます。

N88が対象ならば、フリーの物があるのでそちらを利用して不満があるならF-BASICを購入してみれば良いと思います。

参考URL:http://www.fps.fujitsu.com/products/fbasic/compat.html

>MS-DOS時代のBASICで作ったプログラム=N88

N88ーBASICは、MS-DOS時代と言うよりは、NECのPC-98のMS-DOSで動作していたNEC制のBASICプログログラムです。

そのほかにも、BASICプログラムはあったはずですが、一番利用されていたものがN88だったと思います。

他のBASICプログラムでも、ASCIIセーブされた物なら読み込み可能ですし、多少の知識があれば修正して利用する事もできます。
(DISK-BASIC時代に、N-BASIC→F-BAS...続きを読む

Q5400の正の約数の個数15と、それらの約数の総和の問題

5400の個数を求める問題で
5400=2^3×3^3×5^2であるから、
約数の個数=(3+1)(3+1)(2+1)=48

また、約数の総和は
約数の総和=(2^0+2^1+2^2+2^3)(3^0+3^1+3^2+3^3)(5^0+5^1+5^2)
=15×40×31=18600

と解答されているのですが、約数の個数の求め方とその約数の総和がどうしてこのような式になるのかが分かりません。
出来るだけ、わかりやすく説明できる方いますか?ポイントが分かる人もお願いします。

Aベストアンサー

素因数分解をしたあとから説明します。

では樹形図を考えて見ましょう。

2、3、5の部分の3つのパーツに分かれます。

約数は、
2^0と3^0と5^0→約数1
        5^1→約数5
       5^2→約数25

3^1と5^0→約数3
        5^1→約数15
       5^2→約数75
・・・

2、3、5は素数なので、どの掛け算も同じ値にはなりません。

つまり掛け算の組を考えると全部で
   
(3+1)(3+1)(2+1)=48となります。

2の部分の数×3の部分の数×5の部分の数になってますね。


約数の総和は
 2^0×3^0×5^0
+2^0×3^0×5^1
+2^0×3^0×5^2
・・・・
=2^0×()+2^1()+2^2()+2^3()

( )の中身は同じものがきます。確かめてください。

よって

=(2^0+2^1+2^2+2^3)( )となります。

同じように( )の中を3でくくりまとめると、

総和は(2^0+2^1+2^2+2^3)(3^0+3^1+3^2+3^3)(5^0+5^1+5^2)
=15×40×31=18600

となるはずです。確かめてみてください。
感動できる式ですよ~。
公式と思って使うのも可能です

素因数分解をしたあとから説明します。

では樹形図を考えて見ましょう。

2、3、5の部分の3つのパーツに分かれます。

約数は、
2^0と3^0と5^0→約数1
        5^1→約数5
       5^2→約数25

3^1と5^0→約数3
        5^1→約数15
       5^2→約数75
・・・

2、3、5は素数なので、どの掛け算も同じ値にはなりません。

つまり掛け算の組を考えると全部で
   
(3+1)(3+1)(2+1)=48となります。

2の部分の数×3の...続きを読む

QVB初心者なのでわかりづらい説明になってしまっていますが、宜しくお願い

VB初心者なのでわかりづらい説明になってしまっていますが、宜しくお願いいたします。

ソリューションに含まれる全クラスのメソッド一覧を取得したいと考えています。
考えている処理は以下の通りです。

For i As Integer = 1 To プロジェクト数
  For j As Integer = 1 To クラス数
    ' クラスオブジェクトの取得
    Dim typ As Type = GetType(プロジェクト名.クラス名) ※
    ' クラスが持つメソッドの取得
    Dim methods As MethodInfo() = typ.GetMethods()

    ' 出力処理

  Next
Next

ソリューションの例
Solution
  ├Project1
  │  ├Class1_1
  │  └Class1_2
  ├Project2
  │  ├Class2_1
  │  ├Class2_2
  │  └Class2_3
  └Project3
     └Class3_1

ただ、ソリューションに含まれるプロジェクトの数、プロジェクトに含まれるクラスの数
の取得方法とプロジェクトに含まれているクラス名の取得方法がわかりません。
よろしければ、教えていただけないでしょうか。
また、他に良い方法があれば教えていただけないでしょうか。
宜しくお願いいたします。

環境はVB2008です。

VB初心者なのでわかりづらい説明になってしまっていますが、宜しくお願いいたします。

ソリューションに含まれる全クラスのメソッド一覧を取得したいと考えています。
考えている処理は以下の通りです。

For i As Integer = 1 To プロジェクト数
  For j As Integer = 1 To クラス数
    ' クラスオブジェクトの取得
    Dim typ As Type = GetType(プロジェクト名.クラス名) ※
    ' クラスが持つメソッドの取得
    Dim methods As MethodInfo() = typ.GetMethods()

    ' 出力処理

...続きを読む

Aベストアンサー

For Each a As Assembly In AppDomain.CurrentDomain.GetAssemblies()
System.Diagnostics.Debug.WriteLine(a.FullName)
If a.GlobalAssemblyCache Then Continue For
For Each t As Type In a.GetTypes()
System.Diagnostics.Debug.WriteLine(t.FullName)
For Each m As MethodInfo In t.GetMethods()
System.Diagnostics.Debug.WriteLine(t.FullName + "." + m.Name)
Next
Next
Next

Q素因数分解と約数の個数

こんばんわ。早速ですが、質問に移らさせていただきます。

例えば、36=2の2乗×3の2乗、と素因数分解できます。このように、素数の積にする事により 約数の個数が解ります。この場合、
(指数+1)×(指数+1)が、約数の個数になります。

このような公式を学んだところなのですが、具体的な整数でいろいろと試してみましたが、なぜ、そのような公式になるのかが、検討もつきません。何か、手がかりがあれば、よろしくお願いいたします。

Aベストアンサー

これは組み合わせの問題にも関わってきます。
2を0乗する、2を1乗する…、また
3を0乗する、3を1乗する…、ということで、掛け算の式が
9つできますよね。
2^0×3^0=1
2^1×3^0=2
2^2×3^0=4
2^0×3^1=3
2^1×3^1=6
2^2×3^1=12
2^0×3^2=9
2^1×3^2=18
2^2×3^2=36
このように(指数+1)×(指数+1)が何通りの数ができるかということが、
約数の数になるわけです。

分かりにくい文章でごめんなさい

Q0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題

0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題ですが、一つの数字しか計算が出来ません
5と12の場合は String "5 12" から型 'Long' への変換は無効です。と出てきてしまいます。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n As Long
Dim f As Long

n = CLng(TextBox1.Text) ←ここにエラーが出ます。

TextBox2.Text = CStr(Recur(n))
End Sub

Public Function Recur(ByVal arg As Long) As Long
If arg = 1 Then
Recur = arg
Exit Function
End If
Recur = arg * Recur(arg - 1)
End Function
End Class

というプログラムです。分かる方よろしくお願いします。
実行エラーです。

0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題ですが、一つの数字しか計算が出来ません
5と12の場合は String "5 12" から型 'Long' への変換は無効です。と出てきてしまいます。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n As Long
Dim f As Long

n = CLng(TextBox1.Text) ←ここにエラーが出ます。

TextBox2.Text = CStr(Recur(n))
End Sub

Public Function Recur(ByVal arg As Long) As L...続きを読む

Aベストアンサー

TextBoxに入力された値は、単一の文字列として扱われます。
[5 12]と入力した場合にTextプロパティで取り出せる値は、"5 12"というひとつの文字列です。"5"と"12"のふたつの値を取得することはできません。

なので、数字以外の文字を含む文字列である"5 12"を数値型に変換しようとするとエラーが出てきてしまいます。"5あいうえお12"を数値に変換できないのと一緒です。

複数の入力値を取りたいならば、入力用のTextBoxを複数個用意したり、または入力値をスペースで分割して複数個の値を取り出すコードを実装するなどの工夫が必要です。


人気Q&Aランキング

おすすめ情報