ページ 11

簡単な問題です。

Posted: 2011年11月09日(水) 01:19
by soyuta672
2個の整数を読み込んで、n個の中からr個を取って
並べる順列の総数を出力するプログラムを書いてください。

(ヒント)
n個の中からr個を取って並べる順列の総数(nPr)は、

nPr=n×(n-1)×(n-2)×・・・×(n-r+1)

という式で求めることができます。

まずは簡単な問題1です^^

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 01:45
by GRAM
えぇ。簡単ですね。
とても簡単です。あなたにも答えは分かっているのでしょう?

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 05:44
by bitter_fox
soyuta672 さんが書きました:2個の整数を読み込んで、n個の中からr個を取って
並べる順列の総数を出力するプログラムを書いてください。

まずは簡単な問題1です^^

コード:


object Main
{
	def main(args : Array[String])
	{
		var f = () => (Integer parseInt System.console.readLine)
		var (n, r) = (f(), f())
		println((Main ! n) / (Main ! n - r))
	}

	def !(n : Int) : Long = if (n > 0) n * (Main ! n - 1)  else 1
}

簡単でした。
[hr][修正]
正しくなかったので修正
[修正]
もうちょっと修正(関数名とか色々)

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 12:35
by non
問題を出していただいたので、解いてみました。採点をお願いします。(JAVA勉強中)

コード:

public class fact {
	static int fact(int n,int r){
		return n < r ? 1 : n * fact(n - 1,r);
	}
	public static void main(String[] args){
		int n=Integer.parseInt(args[0]);
		int r=Integer.parseInt(args[1]);
		System.out.println(n + "P" + r + "=" + fact(n,r));
	}
}

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 14:31
by 沖 滉均
質問掲示板に出題とは考えていませんでした。
順列ってなんだっけ?と少々ボケ始めていたのでちょっと書いてみました。
► スポイラーを表示
おや?Tclは使えないのか…括弧が消えてしまうようだ

コード:

proc permute { n r } {
	if {$n < $r} {
		return 1
	} else {
		return [expr $n * [permute [expr $n - 1] $r]]
	}
}

if {$argc == 2} {
	set n [lindex $argv 0]
	set r [lindex $argv 1]

	puts [permute $n [expr $n - $r + 1]]
}
仕方ないのでテキストで載せましょうか、
こんな感じでいかがでしょうか?

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 15:03
by h2so5

コード:

n = ARGV[0].to_i
r = ARGV[1].to_i
 
result = 1
 
for i in (n-r+1)..n
        result *= i
end
 
print "#{n.to_s}P#{r.to_s} = #{result}\n"
どぞ^^

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 15:43
by みけCAT
私も解いてみました。

コード:

   	 
   	
		     
	
		   	
	
		    
			
		        
   	
			 
 
		       	

	         
   	
			
        	 
   	 
			    
				  
   	 
 
			     
			   	
	  	    
 
			    	
	  	 
 
	       		

 
      	 

        		
   	 
				
 	   	 	 
	
  
         	
 


          



zyunretu

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 16:06
by みけCAT
普通にC言語で解いてみました。
本当に簡単ですね。

コード:

#include <stdio.h>

int main(void) {
	unsigned int n,r,result;
	scanf("%u%u",&n,&r);
	asm volatile (
		"mov %1,%%ebx\n\t"
		"mov %2,%%ecx\n\t"
		"mov $0,%%eax\n\t"
		"cmp $0,%%ebx\n\t"
		"jbe loopend\n\t"
		"cmp $0,%%ecx\n\t"
		"jb loopend\n\t"
		"mov $1,%%eax\n\t"
		"loopstart:\n\t"
		"cmp $0,%%ecx\n\t"
		"jbe loopend\n\t"
		"mul %%ebx\n\t"
		"dec %%ebx\n\t"
		"dec %%ecx\n\t"
		"jmp loopstart\n\t"
		"loopend:\n\t"
		"mov %%eax,%0\n\t"
	: "=m"(result)
	: "m"(n),"m"(r)
	: "%eax","%ebx","%ecx","%edx");
	printf("%u\n",result);
	return 0;
}

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 16:09
by めるぽん
Haskell で。

コード:

import Control.Applicative ((<$>))
 
main = do [n,m] <- map read <$> words <$> getLine
          print $ product [n-m+1..n]

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 17:45
by たろ
未熟者ですがチャレンジしてみました。

コード:

<input id=n><input id=r><input type=button id=nPr>
<script>
document.getElementById('nPr').onclick=function(){
  var n=document.getElementById('n').value;
  var r=document.getElementById('r').value;
  var p=1;
  for(r=n-r+1; r<=n; r++) p*=r;
  alert(p);
}
</script>

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 21:32
by ookami
簡単な問題と聞いて。

コード:

function permute(n,r)
    if(n<r) then
        return 1
    else
        return n*permute(n-1,r)
    end
end
print(permute(io.read(),io.read()))

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 21:55
by h2so5
ちょっと変則(´・ω・`)

コード:

$n = $_GET["n"];
$r = $_GET["r"];
$url = 'http://www.google.co.jp/search?q=(' . $n . '+choose+' . $r . ')+*+' . $r . '!';
header("HTTP/1.1 302 Found");
header("Location: " . $url);

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 21:58
by GRAM
流れに乗ってみる

コード:

#include <iostream>
using namespace std;

int main(){
	int n, r;
	cin >> n >> r;
	cout <<
"#include <iostream> \n" <<
"using namespace std; \n " <<
"template< int N > \n " <<
"struct Int{ \n " <<
"	enum { value = N }; \n " <<
"}; \n " <<
"template< typename T >  \n " <<
"struct Factorial{ \n " <<
"}; \n " <<

"template < int N > \n " <<
"struct Factorial< Int <N> >{ \n " <<
"	enum { value = Int<N>::value * Factorial< Int <N - 1> >::value }; \n " <<
"}; \n " <<

"template <> \n " <<
"struct Factorial< Int <0 > >{ \n " <<
"	enum { value = Int<1>::value }; \n " <<
"}; \n " <<

"template< typename T , typename U> \n " <<
"struct nPr{ \n " <<
"}; \n " <<

"template < int N , int R > \n " <<
"struct nPr< Int<N>, Int<R> >{ \n " <<
"	enum { value = Factorial< Int<N> >::value / Factorial< Int<R> >::value }; \n " << 
"}; \n " <<

"int main(){ \n " <<
"	cout << nPr< Int<" << n <<">, Int<" <<r <<"> >::value <<endl; \n " <<
"} \n " << endl;
}
日本語は解釈のしかたによりますよね
二つの数を受け取って
プログラムを書きます。

何の問題もない

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 22:19
by bitter_fox
Java×JavaScriptです。

コード:


import javax.script.*;

public class Main
{
	public static void main(String[] args) throws ScriptException
	{
		int n = Integer.parseInt(System.console().readLine());
		int m = n - Integer.parseInt(System.console().readLine());
		ScriptEngine se = new ScriptEngineManager().getEngineByName("JavaScript");
		StringBuilder sb = new StringBuilder("print(");

		for (sb.append(n--); n > m; n--)
		{
			sb.append('*').append(n);
		}

		se.eval(sb.append(')').toString());
	}
}


Re: 簡単な問題です。

Posted: 2011年11月09日(水) 22:46
by しひ
OCamlで。

コード:

let f n r = Array.init (n-r) (fun i -> (n-i));;
let main = 
	let n = int_of_string Sys.argv.(1) in
	let r = int_of_string Sys.argv.(2) in
		Printf.printf "%d\n" (Array.fold_left (fun x y -> x * y) 1 (f n r));;

Re: 簡単な問題です。

Posted: 2011年11月09日(水) 23:00
by Cr
なでしこで

コード:

全体とは変数
選ぶ数とは変数
答えとは変数
答えは1
「nは?」と尋ねる
全体はそれ
「rは?」と尋ねる
選ぶ数はそれ
全体から全体-選ぶ数+1まで繰り返す
 答えは答え×それ
答えを表示

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 00:02
by bitter_fox
JavaFX1です

コード:

import javafx.geometry.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.input.*;
import javafx.scene.layout.*;
import javafx.scene.text.*;

var textBoxN = TextBox
{
	columns : 3
}

var textBoxR = TextBox
{
	columns : 3
}

var labelAns = Label
{
	font : Font
	{
		size : 20
	}
}

Stage
{
	title : "Permutation"

	scene : Scene
	{
		content :
		[
			VBox
			{
				content :
				[
					HBox
					{
						content :
						[
							textBoxN, textBoxR,
							Button
							{
								text : "Permutation"

								onMouseClicked : function(e : MouseEvent) : Void
								{
									var n = Integer.parseInt(textBoxN.text);
									var r = n - Integer.parseInt(textBoxR.text) + 1;
									var nums = [r..n];
									var ans = 1;

									for (i in nums)
									{
										ans *= i;
									}
									labelAns.text = ans.toString();
								}
							}
						]
					},
					labelAns
				]
			}
		]
	}
}


Re: 簡単な問題です。

Posted: 2011年11月10日(木) 10:03
by 沖 滉均
さて、もう1つ作成してみたのでよろしければ確認してみていただけないでしょうか?
bashだと通常の演算が文字列の計算になってしまうのが面倒ですよね。

コード:

#!/bin/bash

if [ $# -eq 2 ]
then
	let n=$1
	let m=$2
	let p=1
	if [ $n -lt $m ]
	then
		p=1
	else
		let m="${n} - ${m} + 1"
		while [ $m -le $n ]
		do
			let p="${p} * ${m}"
			let m="${m} + 1"
		done
	fi
	echo $p
else
	echo "argument mismatch."
fi
[追記]
インデントに不備があったので修正

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 11:05
by naohiro19
Visual Basicで

コード:

Module Module1

    Function Fact(ByVal n As Integer, ByVal r As Integer) As Integer
        If n < r Then
            Return 1
        Else
            Return n * Fact(n - 1, r)
        End If
    End Function

    Sub Main()
        Dim n As Integer
        Dim r As Integer
        n = CInt(Console.ReadLine())
        r = CInt(Console.ReadLine())
        Console.WriteLine(n + "P" + r + "=" + Fact(n, r))
    End Sub

End Module
[hr]
C++だと骨が折れるのでVBに変更(笑)

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 11:12
by mic16f88
c++で書いたら難しいな笑

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 13:46
by YuO
せっかくなので。
バッチファイルでもできました。面倒なのでエラーチェックは省いています。
# XP以降なら動くはず。Vistaで確認。SET /Aで計算できることが条件です。

コード:

@ECHO OFF
SETLOCAL

IF "%~1"=="" (
  SET /P N=N
) ELSE (
  SET N=%~1
)
IF "%~2"=="" (
  SET /P R=R
) ELSE (
  SET R=%~2
)

SET /A N0=0+N 2>nul
SET /A R0=0+R 2>nul
SET N=%N0%
SET R=%R0%

SET V=1
:LOOP
SET /A V=V*N
SET /A N=N-1
SET /A R=R-1

IF %R% GEQ 1 GOTO LOOP

ECHO %N0%P%R0% = %V%

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 14:32
by 沖 滉均
perl復習中なのでperlでも書いてみました。
最低限のエラーチェックしかしてませんが、perl5.6.1では動いてます。

コード:

#!/usr/bin/perl

if ($#ARGV == 1) {
	($n, $r) = @ARGV;
	if ($n > 0 && $r > 0 && $n >= $r) {
		$p = 1;
		for (($n - $r + 1)..$n) {
			$p *= $_;
		}
		print $p;
	}
}

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 15:07
by non
C#のコンソールアプリで書いてみました。おや、JAVAと同じだ。
ほんと、いろんな言語がありますね。
スレ主さんは、出てこないね。
みけCATさんのホワイトスペースってのは、言語にすら見れない。
面白そうだから、ちょっと調べてみよっと。

コード:

namespace ConsoleApplication1
{
    class Program
    {
        static int fact(int n, int r)
        {
            return n < r ? 1 : n * fact(n - 1, r);
        }

        static void Main(string[] args)
        {
            int n = int.Parse(args[0]);
            int r = int.Parse(args[1]);
            Console.WriteLine(n + "P" + r + "=" + fact(n,r));
        }
    }
}

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 16:31
by beatle
C++で。

コード:

#include <iostream>
#include <iterator>
#include <numeric>
#include <functional>

template <typename T>
class CountIterator : public std::iterator<std::input_iterator_tag, T>
{
	T count_;
	const T diff_;
public:
	CountIterator(const T& count = 0, const T& diff = 1) : count_(count), diff_(diff) {}
	const T& operator *() const { return count_; }
	CountIterator& operator ++() { count_ += diff_; return *this; }
	bool operator !=(const CountIterator& rhs) const { return count_ != rhs.count_; }
	bool operator ==(const CountIterator& rhs) const { return !((*this) != rhs); }
};

int main()
{
	typedef unsigned long NumType;
	NumType n, r;
	std::cin >> n >> r;
	std::cout << std::accumulate(CountIterator<NumType>(n, -1), CountIterator<NumType>(n - r), 1, std::multiplies<NumType>()) << std::endl;
}

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 16:32
by h2so5
問題2はまだですか(´・_・`)

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 20:29
by ookami
エクセルマクロで。
セルA1, A2を入力として、A3に答えを出力します。

コード:

Function permute(n as Integer, r as Integer)
    If n<r Then
        permute=1
    Else
        permute=n*permute(n-1,r)
    End If
End Function

Sub main()
    Cells(3,1).value=permute(Cells(1,1).value,Cells(2,1).value)
End Sub

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 20:57
by h2so5
コピペ出来ないので画像を貼りますね
event.jpg
event.jpg (27.32 KiB) 閲覧数: 13875 回

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:02
by パコネコ
で遅れたw
まずは,って事は第2問に期待してもいいのでしょうか?

皆さんいろいろな言語で書かれていて私にはほとんど分からないですw
私は普通で申し訳ないですがC++で、

コード:

#include <iostream>
main(){int neko,n,r,i;for(printf("入力=n r:"),scanf("%d %d",&n,&r),i=1,neko=n;i<=r;n*=neko-i++)printf("%d\n",n);}
===============
あーかぶった...そしていろんな意味で負けた...ORZ

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:08
by bitter_fox
オーソドックスにCで頑張りました

コード:

n,r;main(a){scanf("%d%d",&n,&r);for(r=n-r;n>r;a*=n--);printf("%d",a);}

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:17
by h2so5
懐かしいTTSneo(´;ω;`)

コード:

ウィンドウ1の作成
ウィンドウ1を表示する
待機する

手順は ウィンドウ1の作成
’ウィンドウの設計で自動処理されますので
’次のプログラムは変更しないでください
’<ウィンドウ1>
ウィンドウ1を使う
	その中の大きさを(304,143)へ変える
	その名前を「ウィンドウ1」へ変える
	その背景を&h8000000Fへ変える
テキスト1を作る
	その位置と大きさを(30,20,250,20)へ変える
テキスト2を作る
	その位置と大きさを(30,50,250,20)へ変える
ボタン1を作る
	その位置と大きさを(110,90,90,40)へ変える
’</ウィンドウ1>
’部品の初期化などは、この次から書き加えてください
終わり
手順は ウィンドウ1のボタン1をクリック
    テキスト1の内容を、nへ入れろ
    テキスト2の内容を、rへ入れろ
    
    結果は、1
	(n-r+1)からnまでカウンタにカウントして繰り返せ
	  結果は、結果×カウンタ
	繰り返し終わり
    
    結果を表示
終わり

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:21
by naohiro19
MSILで

コード:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // コード サイズ       86 (0x56)
  .maxstack  4
  .locals init ([0] int32 n,
           [1] int32 r,
           [2] object[] CS$0$0000)
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.0
  IL_0002:  ldelem.ref
  IL_0003:  call       int32 [mscorlib]System.Int32::Parse(string)
  IL_0008:  stloc.0
  IL_0009:  ldarg.0
  IL_000a:  ldc.i4.1
  IL_000b:  ldelem.ref
  IL_000c:  call       int32 [mscorlib]System.Int32::Parse(string)
  IL_0011:  stloc.1
  IL_0012:  ldc.i4.5
  IL_0013:  newarr     [mscorlib]System.Object
  IL_0018:  stloc.2
  IL_0019:  ldloc.2
  IL_001a:  ldc.i4.0
  IL_001b:  ldloc.0
  IL_001c:  box        [mscorlib]System.Int32
  IL_0021:  stelem.ref
  IL_0022:  ldloc.2
  IL_0023:  ldc.i4.1
  IL_0024:  ldstr      "P"
  IL_0029:  stelem.ref
  IL_002a:  ldloc.2
  IL_002b:  ldc.i4.2
  IL_002c:  ldloc.1
  IL_002d:  box        [mscorlib]System.Int32
  IL_0032:  stelem.ref
  IL_0033:  ldloc.2
  IL_0034:  ldc.i4.3
  IL_0035:  ldstr      "="
  IL_003a:  stelem.ref
  IL_003b:  ldloc.2
  IL_003c:  ldc.i4.4
  IL_003d:  ldloc.0
  IL_003e:  ldloc.1
  IL_003f:  call       int32 ConsoleApplication1.Program::fact(int32,
                                                               int32)
  IL_0044:  box        [mscorlib]System.Int32
  IL_0049:  stelem.ref
  IL_004a:  ldloc.2
  IL_004b:  call       string [mscorlib]System.String::Concat(object[])
  IL_0050:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0055:  ret
} // end of method Program::Main

.method private hidebysig static int32  fact(int32 n,
                                             int32 r) cil managed
{
  // コード サイズ       18 (0x12)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  blt.s      IL_0010
  IL_0004:  ldarg.0
  IL_0005:  ldarg.0
  IL_0006:  ldc.i4.1
  IL_0007:  sub
  IL_0008:  ldarg.1
  IL_0009:  call       int32 ConsoleApplication1.Program::fact(int32,
                                                               int32)
  IL_000e:  mul
  IL_000f:  ret
  IL_0010:  ldc.i4.1
  IL_0011:  ret
} // end of method Program::fact

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:37
by みけCAT
NScripterで書きました。

コード:

*define
game

*start
順列の計算をします。
nPrを計算します。\
*start2
mov %0,0
gosub *inputn
mov %1,0
gosub *inputr
mov %4,%0
mov %5,%1
gosub *calc
n=%4
r=%5
答えは%3です。@
もう一度計算しますか?
selnum %6,"はい","いいえ"
if %6=0 goto *start2
end

*inputn
nを入力してください。
現在のn=%0
selnum %2,"0","1","2","3","4","5","6","7","8","9","戻る","決定"
if %2=10 goto *backn
if %2=11 return
mul %0,10
add %0,%2
goto *inputn
*backn
div %0,10
goto *inputn


*inputr
rを入力してください。
現在のr=%1
selnum %2,"0","1","2","3","4","5","6","7","8","9","戻る","決定"
if %2=10 goto *backr
if %2=11 return
mul %1,10
add %1,%2
goto *inputr
*backr
div %1,10
goto *inputr

*calc
mov %3,1
*calcloop
if %1=0 return
mul %3,%0
sub %0,1
sub %1,1
goto *calcloop

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:44
by h2so5
久しぶりのFlash。
でもjavascriptと変わらない...

コード:

on (click) {
	var n = _root.num_n.value;
	var r = _root.num_r.value;
	
	var result = 1;
	for (var i = n; i >= n - r + 1; i--) {
		result *= i;
	}
	
	_root.result.text = result;
}

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:45
by box
トピックを立てた人は、もう見てないのではないかと思います。
そろそろ、やめにすれば?

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 21:49
by みけCAT
ActiveBasicです。

コード:

#N88BASIC
10  Dim N As QWord
20  Dim R As QWord
30  Dim ANS As QWord
40  PRINT "nPrを計算します。"
50  INPUT "n=",N
60  INPUT "r=",R
70  LET ANS=1
80  WHILE R>0
90  	LET ANS=ANS*N
100 	LET N=N-1
110 	LET R=R-1
120 WEND
130 PRINT "答えは";ANS;"です。"
140 GOTO 40

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 22:08
by みけCAT
HSPです。

コード:

title "階乗の計算"
mes "nPrを計算します。"
mes "↓n"
input n,100,25,10
mes "↓r"
input r,100,25,10
button goto "計算",*calc
stop
*calc
ans=1
nn=n
rr=r
while rr>0
	ans*=nn
	nn--
	rr--
wend
dialog "答えは"+ans+"です。",0,"結果"
stop

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 22:24
by しひ
Schemeで。

コード:

(define n (string->number (car (command-line-arguments))))
(define r (string->number (cadr (command-line-arguments))))
(display (fold * 1 (iota (- n r) n -1)))

Re: 簡単な問題です。

Posted: 2011年11月10日(木) 22:27
by しひ
消えた・・・

コード:

(use srfi-1)
(define n (string->number (car (command-line-arguments))))
(define r (string->number (cadr (command-line-arguments))))
(display (fold * 1 (iota (- n r) n -1)))

Re: 簡単な問題です。

Posted: 2011年11月11日(金) 01:07
by Dixq (管理人)
ほとぼりも冷めたようですし、ご質問に対する回答致しますね。

soyuta672さんがこのトピックを立てた理由は何でしょうか?
課題のため?皆さんのコーディングの仕方をみたかったため?雑談トピックだった?

もしC言語の課題として出されたもので、C言語の一般的なコードが知りたければお手伝いしますので、順番に解いていきましょう。
まず、何が分からないか・どこまで分かるのかを明確にして下さい。

C言語のコードが知りたいのかどうかもまだこちらには分からないので、まずは、そこから教えて下さい。
もし課題であるならば頑張って少しずつ解いていきましょう。